From: Peter Collingbourne Date: Thu, 1 Dec 2016 06:53:47 +0000 (+0000) Subject: Object: Add SF_Executable symbol flag. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=71fc8a346a2ff86ec254eb5b025c1b5c98565c8a;p=llvm Object: Add SF_Executable symbol flag. This allows us to remove a few uses of IRObjectFile::getSymbolGV() in llvm-nm. While here change host-dependent logic in llvm-nm to target-dependent logic. Differential Revision: https://reviews.llvm.org/D27075 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288320 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/SymbolicFile.h b/include/llvm/Object/SymbolicFile.h index 9655202097b..af62e62c51d 100644 --- a/include/llvm/Object/SymbolicFile.h +++ b/include/llvm/Object/SymbolicFile.h @@ -88,7 +88,6 @@ class BasicSymbolRef { const SymbolicFile *OwningObject; public: - // FIXME: should we add a SF_Text? enum Flags : unsigned { SF_None = 0, SF_Undefined = 1U << 0, // Symbol is defined in another object file @@ -103,6 +102,8 @@ public: SF_Thumb = 1U << 8, // Thumb symbol in a 32-bit ARM binary SF_Hidden = 1U << 9, // Symbol has hidden visibility SF_Const = 1U << 10, // Symbol value is constant + SF_Executable = 1U << 11, // Symbol points to an executable section + // (IR only) }; BasicSymbolRef() : OwningObject(nullptr) { } diff --git a/lib/Object/ModuleSymbolTable.cpp b/lib/Object/ModuleSymbolTable.cpp index 5e534af4410..c8b1bb6b775 100644 --- a/lib/Object/ModuleSymbolTable.cpp +++ b/lib/Object/ModuleSymbolTable.cpp @@ -109,7 +109,8 @@ void ModuleSymbolTable::CollectAsmSymbols( for (auto &KV : Streamer) { StringRef Key = KV.first(); RecordStreamer::State Value = KV.second; - uint32_t Res = BasicSymbolRef::SF_None; + // FIXME: For now we just assume that all asm symbols are executable. + uint32_t Res = BasicSymbolRef::SF_Executable; switch (Value) { case RecordStreamer::NeverSeen: llvm_unreachable("NeverSeen should have been replaced earlier"); @@ -163,6 +164,8 @@ uint32_t ModuleSymbolTable::getSymbolFlags(Symbol S) const { if (GVar->isConstant()) Res |= BasicSymbolRef::SF_Const; } + if (dyn_cast_or_null(GV->getBaseObject())) + Res |= BasicSymbolRef::SF_Executable; if (GV->hasPrivateLinkage()) Res |= BasicSymbolRef::SF_FormatSpecific; if (!GV->hasLocalLinkage()) diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 436cf9cac68..33385e9953e 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -313,10 +313,10 @@ static void darwinPrintSymbol(SymbolicFile &Obj, SymbolListT::iterator I, NType |= MachO::N_SECT; if (SymFlags & SymbolRef::SF_Const) NSect = 3; - else { - IRObjectFile *IRobj = dyn_cast(&Obj); - NSect = (getSymbolNMTypeChar(*IRobj, I->Sym) == 't') ? 1 : 2; - } + else if (SymFlags & SymbolRef::SF_Executable) + NSect = 1; + else + NSect = 2; } if (SymFlags & SymbolRef::SF_Weak) NDesc |= MachO::N_WEAK_DEF; @@ -882,15 +882,17 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { return '?'; } -static char getSymbolNMTypeChar(const GlobalValue &GV) { +static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) { + uint32_t Flags = I->getFlags(); // FIXME: should we print 'b'? At the IR level we cannot be sure if this // will be in bss or not, but we could approximate. - return GV.getValueType()->isFunctionTy() ? 't' : 'd'; -} - -static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) { - const GlobalValue *GV = Obj.getSymbolGV(I->getRawDataRefImpl()); - return !GV ? 't' : getSymbolNMTypeChar(*GV); + if (Flags & SymbolRef::SF_Executable) + return 't'; + else if (Triple(Obj.getTargetTriple()).isOSDarwin() && + (Flags & SymbolRef::SF_Const)) + return 's'; + else + return 'd'; } static bool isObject(SymbolicFile &Obj, basic_symbol_iterator I) { @@ -915,12 +917,8 @@ static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) { char Ret = '?'; if (Symflags & object::SymbolRef::SF_Absolute) Ret = 'a'; - else if (IRObjectFile *IR = dyn_cast(&Obj)) { + else if (IRObjectFile *IR = dyn_cast(&Obj)) Ret = getSymbolNMTypeChar(*IR, I); - Triple Host(sys::getDefaultTargetTriple()); - if (Ret == 'd' && Host.isOSDarwin() && Symflags & SymbolRef::SF_Const) - Ret = 's'; - } else if (COFFObjectFile *COFF = dyn_cast(&Obj)) Ret = getSymbolNMTypeChar(*COFF, I); else if (MachOObjectFile *MachO = dyn_cast(&Obj))