diff options
author | Chris Lattner <sabre@nondot.org> | 2006-09-26 03:38:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-09-26 03:38:18 +0000 |
commit | cb05af852f1d346ac07b84c74a930a5cdbd6d427 (patch) | |
tree | b7a6f3a4174cff9614c3668b631a2dcbc5a7d1ee /lib/CodeGen | |
parent | 384299ef45840acf7c43125dc935237b333e339a (diff) |
Add support for targets that want to do something with the llvm.used list,
because they have an aggressive linker that does dead code stripping.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30604 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/AsmPrinter.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index bcdb393c23..bfc0519806 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -253,8 +253,11 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { assert(GV->hasInitializer() && "Not a special LLVM global!"); - if (GV->getName() == "llvm.used") - return true; // No need to emit this at all. + if (GV->getName() == "llvm.used") { + if (TAI->getUsedDirective() != 0) // No need to emit this at all. + EmitLLVMUsedList(GV->getInitializer()); + return true; + } if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) { SwitchToDataSection(TAI->getStaticCtorsSection(), 0); @@ -273,6 +276,22 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { return false; } +/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each +/// global in the specified llvm.used list as being used with this directive. +void AsmPrinter::EmitLLVMUsedList(Constant *List) { + const char *Directive = TAI->getUsedDirective(); + + // Should be an array of 'sbyte*'. + ConstantArray *InitList = dyn_cast<ConstantArray>(List); + if (InitList == 0) return; + + for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { + O << Directive; + EmitConstantValueOnly(InitList->getOperand(i)); + O << "\n"; + } +} + /// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the /// function pointers, ignoring the init priority. void AsmPrinter::EmitXXStructorList(Constant *List) { |