| //===-- MSILWriter.h - TargetMachine for the MSIL ---------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares the MSILWriter that is used by the MSIL. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MSILWRITER_H |
| #define MSILWRITER_H |
| |
| #include "llvm/CallingConv.h" |
| #include "llvm/Constants.h" |
| #include "llvm/Module.h" |
| #include "llvm/Instructions.h" |
| #include "llvm/IntrinsicInst.h" |
| #include "llvm/Pass.h" |
| #include "llvm/PassManager.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Analysis/FindUsedTypes.h" |
| #include "llvm/Analysis/LoopInfo.h" |
| #include "llvm/Support/FormattedStream.h" |
| #include "llvm/Support/GetElementPtrTypeIterator.h" |
| #include "llvm/Target/TargetData.h" |
| #include "llvm/Target/TargetMachine.h" |
| |
| namespace llvm { |
| extern Target TheMSILTarget; |
| |
| class MSILModule : public ModulePass { |
| Module *ModulePtr; |
| const std::set<const Type *>*& UsedTypes; |
| const TargetData*& TD; |
| |
| public: |
| static char ID; |
| MSILModule(const std::set<const Type *>*& _UsedTypes, |
| const TargetData*& _TD) |
| : ModulePass(ID), UsedTypes(_UsedTypes), TD(_TD) {} |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const { |
| AU.addRequired<FindUsedTypes>(); |
| AU.addRequired<TargetData>(); |
| } |
| |
| virtual const char *getPassName() const { |
| return "MSIL backend definitions"; |
| } |
| |
| virtual bool runOnModule(Module &M); |
| |
| }; |
| |
| class MSILWriter : public FunctionPass { |
| struct StaticInitializer { |
| const Constant* constant; |
| uint64_t offset; |
| |
| StaticInitializer() |
| : constant(0), offset(0) {} |
| |
| StaticInitializer(const Constant* _constant, uint64_t _offset) |
| : constant(_constant), offset(_offset) {} |
| }; |
| |
| uint64_t UniqID; |
| |
| uint64_t getUniqID() { |
| return ++UniqID; |
| } |
| |
| public: |
| formatted_raw_ostream &Out; |
| Module* ModulePtr; |
| const TargetData* TD; |
| LoopInfo *LInfo; |
| std::vector<StaticInitializer>* InitListPtr; |
| std::map<const GlobalVariable*,std::vector<StaticInitializer> > |
| StaticInitList; |
| const std::set<const Type *>* UsedTypes; |
| static char ID; |
| DenseMap<const Value*, unsigned> AnonValueNumbers; |
| unsigned NextAnonValueNumber; |
| |
| MSILWriter(formatted_raw_ostream &o) : FunctionPass(ID), Out(o), |
| NextAnonValueNumber(0) { |
| UniqID = 0; |
| } |
| |
| enum ValueType { |
| UndefVT, |
| GlobalVT, |
| InternalVT, |
| ArgumentVT, |
| LocalVT, |
| ConstVT, |
| ConstExprVT |
| }; |
| |
| bool isVariable(ValueType V) { |
| return V==GlobalVT || V==InternalVT || V==ArgumentVT || V==LocalVT; |
| } |
| |
| bool isConstValue(ValueType V) { |
| return V==ConstVT || V==ConstExprVT; |
| } |
| |
| virtual const char *getPassName() const { return "MSIL backend"; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const { |
| AU.addRequired<LoopInfo>(); |
| AU.setPreservesAll(); |
| } |
| |
| bool runOnFunction(Function &F); |
| |
| virtual bool doInitialization(Module &M); |
| |
| virtual bool doFinalization(Module &M); |
| |
| void printModuleStartup(); |
| |
| bool isZeroValue(const Value* V); |
| |
| std::string getValueName(const Value* V); |
| |
| std::string getLabelName(const Value* V); |
| |
| std::string getLabelName(const std::string& Name); |
| |
| std::string getConvModopt(CallingConv::ID CallingConvID); |
| |
| std::string getArrayTypeName(Type::TypeID TyID, const Type* Ty); |
| |
| std::string getPrimitiveTypeName(const Type* Ty, bool isSigned); |
| |
| std::string getFunctionTypeName(const Type* Ty); |
| |
| std::string getPointerTypeName(const Type* Ty); |
| |
| std::string getTypeName(const Type* Ty, bool isSigned = false, |
| bool isNested = false); |
| |
| ValueType getValueLocation(const Value* V); |
| |
| std::string getTypePostfix(const Type* Ty, bool Expand, |
| bool isSigned = false); |
| |
| void printConvToPtr(); |
| |
| void printPtrLoad(uint64_t N); |
| |
| void printValuePtrLoad(const Value* V); |
| |
| void printConstLoad(const Constant* C); |
| |
| void printValueLoad(const Value* V); |
| |
| void printValueSave(const Value* V); |
| |
| void printBinaryInstruction(const char* Name, const Value* Left, |
| const Value* Right); |
| |
| void printSimpleInstruction(const char* Inst, const char* Operand = NULL); |
| |
| void printPHICopy(const BasicBlock* Src, const BasicBlock* Dst); |
| |
| void printBranchToBlock(const BasicBlock* CurrBB, |
| const BasicBlock* TrueBB, |
| const BasicBlock* FalseBB); |
| |
| void printBranchInstruction(const BranchInst* Inst); |
| |
| void printSelectInstruction(const Value* Cond, const Value* VTrue, |
| const Value* VFalse); |
| |
| void printIndirectLoad(const Value* V); |
| |
| void printIndirectSave(const Value* Ptr, const Value* Val); |
| |
| void printIndirectSave(const Type* Ty); |
| |
| void printCastInstruction(unsigned int Op, const Value* V, |
| const Type* Ty, const Type* SrcTy=0); |
| |
| void printGepInstruction(const Value* V, gep_type_iterator I, |
| gep_type_iterator E); |
| |
| std::string getCallSignature(const FunctionType* Ty, |
| const Instruction* Inst, |
| std::string Name); |
| |
| void printFunctionCall(const Value* FnVal, const Instruction* Inst); |
| |
| void printIntrinsicCall(const IntrinsicInst* Inst); |
| |
| void printCallInstruction(const Instruction* Inst); |
| |
| void printICmpInstruction(unsigned Predicate, const Value* Left, |
| const Value* Right); |
| |
| void printFCmpInstruction(unsigned Predicate, const Value* Left, |
| const Value* Right); |
| |
| void printInvokeInstruction(const InvokeInst* Inst); |
| |
| void printSwitchInstruction(const SwitchInst* Inst); |
| |
| void printVAArgInstruction(const VAArgInst* Inst); |
| |
| void printAllocaInstruction(const AllocaInst* Inst); |
| |
| void printInstruction(const Instruction* Inst); |
| |
| void printLoop(const Loop* L); |
| |
| void printBasicBlock(const BasicBlock* BB); |
| |
| void printLocalVariables(const Function& F); |
| |
| void printFunctionBody(const Function& F); |
| |
| void printConstantExpr(const ConstantExpr* CE); |
| |
| void printStaticInitializerList(); |
| |
| void printFunction(const Function& F); |
| |
| void printDeclarations(const TypeSymbolTable& ST); |
| |
| unsigned int getBitWidth(const Type* Ty); |
| |
| void printStaticConstant(const Constant* C, uint64_t& Offset); |
| |
| void printStaticInitializer(const Constant* C, const std::string& Name); |
| |
| void printVariableDefinition(const GlobalVariable* G); |
| |
| void printGlobalVariables(); |
| |
| const char* getLibraryName(const Function* F); |
| |
| const char* getLibraryName(const GlobalVariable* GV); |
| |
| const char* getLibraryForSymbol(StringRef Name, bool isFunction, |
| CallingConv::ID CallingConv); |
| |
| void printExternals(); |
| }; |
| |
| } |
| |
| #endif |
| |