diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-12-01 06:53:47 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-12-01 06:53:47 +0000 |
commit | e2f1b4a651e37966c586ec4a8cf47a1255bcedaa (patch) | |
tree | 61d6671ddd30eea028f5857ee93113975464b316 /llvm/tools | |
parent | 863cbfbebad4609678f5f74f5750b230e8aa5d77 (diff) | |
download | bcm5719-llvm-e2f1b4a651e37966c586ec4a8cf47a1255bcedaa.tar.gz bcm5719-llvm-e2f1b4a651e37966c586ec4a8cf47a1255bcedaa.zip |
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
llvm-svn: 288320
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 436cf9cac68..33385e9953e 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/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<IRObjectFile>(&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<IRObjectFile>(&Obj)) { + else if (IRObjectFile *IR = dyn_cast<IRObjectFile>(&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<COFFObjectFile>(&Obj)) Ret = getSymbolNMTypeChar(*COFF, I); else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj)) |