Change allowsUnalignedMemoryAccesses to take type argument since some targets
[llvm/avr.git] / lib / Target / MSIL / MSILWriter.h
blobaa9e07540f9e340aa8a712bcc0720b49fd9a5754
1 //===-- MSILWriter.h - TargetMachine for the MSIL ---------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the MSILWriter that is used by the MSIL.
12 //===----------------------------------------------------------------------===//
13 #ifndef MSILWRITER_H
14 #define MSILWRITER_H
16 #include "llvm/Constants.h"
17 #include "llvm/Module.h"
18 #include "llvm/Instructions.h"
19 #include "llvm/IntrinsicInst.h"
20 #include "llvm/Pass.h"
21 #include "llvm/PassManager.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Analysis/FindUsedTypes.h"
24 #include "llvm/Analysis/LoopInfo.h"
25 #include "llvm/Support/FormattedStream.h"
26 #include "llvm/Support/GetElementPtrTypeIterator.h"
27 #include "llvm/Target/TargetData.h"
28 #include "llvm/Target/TargetMachine.h"
29 #include "llvm/Support/Mangler.h"
31 namespace llvm {
32 extern Target TheMSILTarget;
34 class MSILModule : public ModulePass {
35 Module *ModulePtr;
36 const std::set<const Type *>*& UsedTypes;
37 const TargetData*& TD;
39 public:
40 static char ID;
41 MSILModule(const std::set<const Type *>*& _UsedTypes,
42 const TargetData*& _TD)
43 : ModulePass(&ID), UsedTypes(_UsedTypes), TD(_TD) {}
45 void getAnalysisUsage(AnalysisUsage &AU) const {
46 AU.addRequired<FindUsedTypes>();
47 AU.addRequired<TargetData>();
50 virtual const char *getPassName() const {
51 return "MSIL backend definitions";
54 virtual bool runOnModule(Module &M);
58 class MSILWriter : public FunctionPass {
59 struct StaticInitializer {
60 const Constant* constant;
61 uint64_t offset;
63 StaticInitializer()
64 : constant(0), offset(0) {}
66 StaticInitializer(const Constant* _constant, uint64_t _offset)
67 : constant(_constant), offset(_offset) {}
70 uint64_t UniqID;
72 uint64_t getUniqID() {
73 return ++UniqID;
76 public:
77 formatted_raw_ostream &Out;
78 Module* ModulePtr;
79 const TargetData* TD;
80 Mangler* Mang;
81 LoopInfo *LInfo;
82 std::vector<StaticInitializer>* InitListPtr;
83 std::map<const GlobalVariable*,std::vector<StaticInitializer> >
84 StaticInitList;
85 const std::set<const Type *>* UsedTypes;
86 static char ID;
87 DenseMap<const Value*, unsigned> AnonValueNumbers;
88 unsigned NextAnonValueNumber;
90 MSILWriter(formatted_raw_ostream &o) : FunctionPass(&ID), Out(o),
91 NextAnonValueNumber(0) {
92 UniqID = 0;
95 enum ValueType {
96 UndefVT,
97 GlobalVT,
98 InternalVT,
99 ArgumentVT,
100 LocalVT,
101 ConstVT,
102 ConstExprVT
105 bool isVariable(ValueType V) {
106 return V==GlobalVT || V==InternalVT || V==ArgumentVT || V==LocalVT;
109 bool isConstValue(ValueType V) {
110 return V==ConstVT || V==ConstExprVT;
113 virtual const char *getPassName() const { return "MSIL backend"; }
115 void getAnalysisUsage(AnalysisUsage &AU) const {
116 AU.addRequired<LoopInfo>();
117 AU.setPreservesAll();
120 bool runOnFunction(Function &F);
122 virtual bool doInitialization(Module &M);
124 virtual bool doFinalization(Module &M);
126 void printModuleStartup();
128 bool isZeroValue(const Value* V);
130 std::string getValueName(const Value* V);
132 std::string getLabelName(const Value* V);
134 std::string getLabelName(const std::string& Name);
136 std::string getConvModopt(unsigned CallingConvID);
138 std::string getArrayTypeName(Type::TypeID TyID, const Type* Ty);
140 std::string getPrimitiveTypeName(const Type* Ty, bool isSigned);
142 std::string getFunctionTypeName(const Type* Ty);
144 std::string getPointerTypeName(const Type* Ty);
146 std::string getTypeName(const Type* Ty, bool isSigned = false,
147 bool isNested = false);
149 ValueType getValueLocation(const Value* V);
151 std::string getTypePostfix(const Type* Ty, bool Expand,
152 bool isSigned = false);
154 void printConvToPtr();
156 void printPtrLoad(uint64_t N);
158 void printValuePtrLoad(const Value* V);
160 void printConstLoad(const Constant* C);
162 void printValueLoad(const Value* V);
164 void printValueSave(const Value* V);
166 void printBinaryInstruction(const char* Name, const Value* Left,
167 const Value* Right);
169 void printSimpleInstruction(const char* Inst, const char* Operand = NULL);
171 void printPHICopy(const BasicBlock* Src, const BasicBlock* Dst);
173 void printBranchToBlock(const BasicBlock* CurrBB,
174 const BasicBlock* TrueBB,
175 const BasicBlock* FalseBB);
177 void printBranchInstruction(const BranchInst* Inst);
179 void printSelectInstruction(const Value* Cond, const Value* VTrue,
180 const Value* VFalse);
182 void printIndirectLoad(const Value* V);
184 void printIndirectSave(const Value* Ptr, const Value* Val);
186 void printIndirectSave(const Type* Ty);
188 void printCastInstruction(unsigned int Op, const Value* V,
189 const Type* Ty, const Type* SrcTy=0);
191 void printGepInstruction(const Value* V, gep_type_iterator I,
192 gep_type_iterator E);
194 std::string getCallSignature(const FunctionType* Ty,
195 const Instruction* Inst,
196 std::string Name);
198 void printFunctionCall(const Value* FnVal, const Instruction* Inst);
200 void printIntrinsicCall(const IntrinsicInst* Inst);
202 void printCallInstruction(const Instruction* Inst);
204 void printICmpInstruction(unsigned Predicate, const Value* Left,
205 const Value* Right);
207 void printFCmpInstruction(unsigned Predicate, const Value* Left,
208 const Value* Right);
210 void printInvokeInstruction(const InvokeInst* Inst);
212 void printSwitchInstruction(const SwitchInst* Inst);
214 void printVAArgInstruction(const VAArgInst* Inst);
216 void printAllocaInstruction(const AllocaInst* Inst);
218 void printInstruction(const Instruction* Inst);
220 void printLoop(const Loop* L);
222 void printBasicBlock(const BasicBlock* BB);
224 void printLocalVariables(const Function& F);
226 void printFunctionBody(const Function& F);
228 void printConstantExpr(const ConstantExpr* CE);
230 void printStaticInitializerList();
232 void printFunction(const Function& F);
234 void printDeclarations(const TypeSymbolTable& ST);
236 unsigned int getBitWidth(const Type* Ty);
238 void printStaticConstant(const Constant* C, uint64_t& Offset);
240 void printStaticInitializer(const Constant* C, const std::string& Name);
242 void printVariableDefinition(const GlobalVariable* G);
244 void printGlobalVariables();
246 const char* getLibraryName(const Function* F);
248 const char* getLibraryName(const GlobalVariable* GV);
250 const char* getLibraryForSymbol(const StringRef &Name, bool isFunction,
251 unsigned CallingConv);
253 void printExternals();
258 #endif