diff options
author | Chris Lattner <sabre@nondot.org> | 2009-06-16 22:38:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-06-16 22:38:04 +0000 |
commit | 46f85e5e744ac701e6caff0fc26baed2f277fe28 (patch) | |
tree | 93f9c64ae07890d694e5c9d4c46065cd5468f19c /lib/Target/Mips | |
parent | 714b72589d6186ab6cbbae319168b32c39e3a037 (diff) | |
download | external_llvm-46f85e5e744ac701e6caff0fc26baed2f277fe28.zip external_llvm-46f85e5e744ac701e6caff0fc26baed2f277fe28.tar.gz external_llvm-46f85e5e744ac701e6caff0fc26baed2f277fe28.tar.bz2 |
fix a circular dependency between the mips code generator
and its asmprinter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73573 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips')
-rw-r--r-- | lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp | 8 | ||||
-rw-r--r-- | lib/Target/Mips/MipsTargetMachine.cpp | 9 | ||||
-rw-r--r-- | lib/Target/Mips/MipsTargetMachine.h | 15 |
3 files changed, 28 insertions, 4 deletions
diff --git a/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp b/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp index 201ee05..077ec96 100644 --- a/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp @@ -579,6 +579,14 @@ doFinalization(Module &M) return AsmPrinter::doFinalization(M); } +namespace { + static struct Register { + Register() { + MipsTargetMachine::registerAsmPrinter(createMipsCodePrinterPass); + } + } Registrator; +} + // Force static initialization when called from // llvm/InitializeAllAsmPrinters.h namespace llvm { diff --git a/lib/Target/Mips/MipsTargetMachine.cpp b/lib/Target/Mips/MipsTargetMachine.cpp index 720e9a8..83b9b62 100644 --- a/lib/Target/Mips/MipsTargetMachine.cpp +++ b/lib/Target/Mips/MipsTargetMachine.cpp @@ -31,6 +31,9 @@ int MipsTargetMachineModule = 0; static RegisterTarget<MipsTargetMachine> X("mips", "Mips"); static RegisterTarget<MipselTargetMachine> Y("mipsel", "Mipsel"); +MipsTargetMachine::AsmPrinterCtorFn MipsTargetMachine::AsmPrinterCtor = 0; + + // Force static initialization when called from llvm/InitializeAllTargets.h namespace llvm { void InitializeMipsTarget() { } @@ -130,9 +133,9 @@ addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel) // true if AssemblyEmitter is supported bool MipsTargetMachine:: addAssemblyEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, - bool Verbose, raw_ostream &Out) -{ + bool Verbose, raw_ostream &Out) { // Output assembly language. - PM.add(createMipsCodePrinterPass(Out, *this, OptLevel, Verbose)); + assert(AsmPrinterCtor && "AsmPrinter was not linked in"); + PM.add(AsmPrinterCtor(Out, *this, OptLevel, Verbose)); return false; } diff --git a/lib/Target/Mips/MipsTargetMachine.h b/lib/Target/Mips/MipsTargetMachine.h index a9e1df2..85fafad 100644 --- a/lib/Target/Mips/MipsTargetMachine.h +++ b/lib/Target/Mips/MipsTargetMachine.h @@ -33,10 +33,23 @@ namespace llvm { protected: virtual const TargetAsmInfo *createTargetAsmInfo() const; - + protected: + // To avoid having target depend on the asmprinter stuff libraries, + // asmprinter set this functions to ctor pointer at startup time if they are + // linked in. + typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, + MipsTargetMachine &tm, + CodeGenOpt::Level OptLevel, + bool verbose); + static AsmPrinterCtorFn AsmPrinterCtor; + public: MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle); + static void registerAsmPrinter(AsmPrinterCtorFn F) { + AsmPrinterCtor = F; + } + virtual const MipsInstrInfo *getInstrInfo() const { return &InstrInfo; } virtual const TargetFrameInfo *getFrameInfo() const |