xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceConverter.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceConverter.h - Converts LLVM to ICE --------*- C++ -*-===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker ///
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the LLVM to ICE converter.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICECONVERTER_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICECONVERTER_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceTranslator.h"
20*03ce13f7SAndroid Build Coastguard Worker 
21*03ce13f7SAndroid Build Coastguard Worker namespace llvm {
22*03ce13f7SAndroid Build Coastguard Worker class GlobalValue;
23*03ce13f7SAndroid Build Coastguard Worker class Module;
24*03ce13f7SAndroid Build Coastguard Worker } // namespace llvm
25*03ce13f7SAndroid Build Coastguard Worker 
26*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
27*03ce13f7SAndroid Build Coastguard Worker 
28*03ce13f7SAndroid Build Coastguard Worker class Converter : public Translator {
29*03ce13f7SAndroid Build Coastguard Worker   Converter() = delete;
30*03ce13f7SAndroid Build Coastguard Worker   Converter(const Converter &) = delete;
31*03ce13f7SAndroid Build Coastguard Worker   Converter &operator=(const Converter &) = delete;
32*03ce13f7SAndroid Build Coastguard Worker 
33*03ce13f7SAndroid Build Coastguard Worker public:
Converter(llvm::Module * Mod,GlobalContext * Ctx)34*03ce13f7SAndroid Build Coastguard Worker   Converter(llvm::Module *Mod, GlobalContext *Ctx)
35*03ce13f7SAndroid Build Coastguard Worker       : Translator(Ctx), Mod(Mod),
36*03ce13f7SAndroid Build Coastguard Worker         GlobalDeclarationsPool(new VariableDeclarationList()) {}
37*03ce13f7SAndroid Build Coastguard Worker 
38*03ce13f7SAndroid Build Coastguard Worker   ~Converter() override = default;
39*03ce13f7SAndroid Build Coastguard Worker 
40*03ce13f7SAndroid Build Coastguard Worker   /// Converts the LLVM Module to ICE. Sets exit status to false if successful,
41*03ce13f7SAndroid Build Coastguard Worker   /// true otherwise.
42*03ce13f7SAndroid Build Coastguard Worker   void convertToIce();
43*03ce13f7SAndroid Build Coastguard Worker 
getModule()44*03ce13f7SAndroid Build Coastguard Worker   llvm::Module *getModule() const { return Mod; }
45*03ce13f7SAndroid Build Coastguard Worker 
46*03ce13f7SAndroid Build Coastguard Worker   /// Returns the global declaration associated with the corresponding global
47*03ce13f7SAndroid Build Coastguard Worker   /// value V. If no such global address, generates fatal error.
48*03ce13f7SAndroid Build Coastguard Worker   GlobalDeclaration *getGlobalDeclaration(const llvm::GlobalValue *V);
49*03ce13f7SAndroid Build Coastguard Worker 
50*03ce13f7SAndroid Build Coastguard Worker private:
51*03ce13f7SAndroid Build Coastguard Worker   llvm::Module *Mod;
52*03ce13f7SAndroid Build Coastguard Worker   using GlobalDeclarationMapType =
53*03ce13f7SAndroid Build Coastguard Worker       std::map<const llvm::GlobalValue *, GlobalDeclaration *>;
54*03ce13f7SAndroid Build Coastguard Worker   GlobalDeclarationMapType GlobalDeclarationMap;
55*03ce13f7SAndroid Build Coastguard Worker 
56*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<VariableDeclarationList> GlobalDeclarationsPool;
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker   /// Walks module and generates names for unnamed globals using prefix
59*03ce13f7SAndroid Build Coastguard Worker   /// getFlags().DefaultGlobalPrefix, if the prefix is non-empty.
60*03ce13f7SAndroid Build Coastguard Worker   void nameUnnamedGlobalVariables(llvm::Module *Mod);
61*03ce13f7SAndroid Build Coastguard Worker 
62*03ce13f7SAndroid Build Coastguard Worker   /// Walks module and generates names for unnamed functions using prefix
63*03ce13f7SAndroid Build Coastguard Worker   /// getFlags().DefaultFunctionPrefix, if the prefix is non-empty.
64*03ce13f7SAndroid Build Coastguard Worker   void nameUnnamedFunctions(llvm::Module *Mod);
65*03ce13f7SAndroid Build Coastguard Worker 
66*03ce13f7SAndroid Build Coastguard Worker   /// Converts functions to ICE, and then machine code.
67*03ce13f7SAndroid Build Coastguard Worker   void convertFunctions();
68*03ce13f7SAndroid Build Coastguard Worker 
69*03ce13f7SAndroid Build Coastguard Worker   /// Converts globals to ICE, and then machine code.
70*03ce13f7SAndroid Build Coastguard Worker   void convertGlobals(llvm::Module *Mod);
71*03ce13f7SAndroid Build Coastguard Worker 
72*03ce13f7SAndroid Build Coastguard Worker   /// Installs global declarations into GlobalDeclarationMap.
73*03ce13f7SAndroid Build Coastguard Worker   void installGlobalDeclarations(llvm::Module *Mod);
74*03ce13f7SAndroid Build Coastguard Worker };
75*03ce13f7SAndroid Build Coastguard Worker 
76*03ce13f7SAndroid Build Coastguard Worker } // namespace Ice
77*03ce13f7SAndroid Build Coastguard Worker 
78*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICECONVERTER_H
79