From: Bill Wendling Date: Thu, 11 Mar 2010 01:18:13 +0000 (+0000) Subject: When outputing a non-lazy pointer for a stub, we may need to fill in the value X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=52a50e5d0e6ac08d86706dbdd8f4a5dbb44da4cb;p=oota-llvm.git When outputing a non-lazy pointer for a stub, we may need to fill in the value for the NLP because the object it's pointing to may be internal to the file. This seems counter-intuitive, but bear with me. When we place the LSDA into the TEXT section, the type info pointers need to be indirect and pc-rel. We accomplish this by using NLPs. However, sometimes the types are local to the file. GCC gets around this by not using a NLP in this case, but a "regular" indirection like this: GCC_except_tbl: .long Lfoo-. __ZTIA: @ This is local ... Lfoo: .long __ZTIA LLVM prefers NLPs on Darwin. In fact, it's more optimal for load performance to use them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98218 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index a2aeca4e066..42b8820c500 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -1137,15 +1137,16 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { // L_foo$stub: OutStreamer.EmitLabel(Stubs[i].first); // .indirect_symbol _foo - MCSymbol *MCSym = Stubs[i].second.getPointer(); - OutStreamer.EmitSymbolAttribute(MCSym, MCSA_IndirectSymbol); + MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; + OutStreamer.EmitSymbolAttribute(MCSym.getPointer(),MCSA_IndirectSymbol); - if (MCSym->isUndefined()) + if (MCSym.getInt()) // External to current translation unit. OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/); else // Internal to current translation unit. - OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym, OutContext), + OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), + OutContext), 4/*size*/, 0/*addrspace*/); }