diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-24 10:20:30 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-24 10:20:30 +0000 |
| commit | d7a32ea4b86c04ba0c4736f803527eb393a40867 (patch) | |
| tree | 1b09dcd2e51416a33c0b030346842e8ea6dd3e38 /llvm/tools | |
| parent | 595348228569c587e14bf8cea1c4fdf1b503c104 (diff) | |
| download | bcm5719-llvm-d7a32ea4b86c04ba0c4736f803527eb393a40867.tar.gz bcm5719-llvm-d7a32ea4b86c04ba0c4736f803527eb393a40867.zip | |
Change how symbol sizes are handled in lib/Object.
COFF and MachO only define symbol sizes for common symbols. Reflect that
in the class hierarchy by having a method for common symbols only in the base
and a general one in ELF.
This avoids the need of using a magic value for the size, which had a few
problems
* Most callers didn't check for it.
* The ones that did could not tell the magic value from a file actually having
that value.
llvm-svn: 240529
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/dsymutil/MachODebugMapParser.cpp | 9 | ||||
| -rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 24 | ||||
| -rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 11 | ||||
| -rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 9 | ||||
| -rw-r--r-- | llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp | 15 |
5 files changed, 32 insertions, 36 deletions
diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp index b803e410199..b1e6abcefa8 100644 --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -160,7 +160,7 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, // symbol table to find its address as it might not be in the // debug map (for common symbols). Value = getMainBinarySymbolAddress(Name); - if (Value == UnknownAddressOrSize) + if (Value == UnknownAddress) return; break; case MachO::N_FUN: @@ -199,8 +199,7 @@ void MachODebugMapParser::loadCurrentObjectFileSymbols() { for (auto Sym : CurrentObjectHolder.Get().symbols()) { StringRef Name; uint64_t Addr; - if (Sym.getAddress(Addr) || Addr == UnknownAddressOrSize || - Sym.getName(Name)) + if (Sym.getAddress(Addr) || Addr == UnknownAddress || Sym.getName(Name)) continue; CurrentObjectAddresses[Name] = Addr; } @@ -212,7 +211,7 @@ void MachODebugMapParser::loadCurrentObjectFileSymbols() { uint64_t MachODebugMapParser::getMainBinarySymbolAddress(StringRef Name) { auto Sym = MainBinarySymbolAddresses.find(Name); if (Sym == MainBinarySymbolAddresses.end()) - return UnknownAddressOrSize; + return UnknownAddress; return Sym->second; } @@ -233,7 +232,7 @@ void MachODebugMapParser::loadMainBinarySymbols() { // are the only ones that need to be queried because the address // of common data won't be described in the debug map. All other // addresses should be fetched for the debug map. - if (Sym.getAddress(Addr) || Addr == UnknownAddressOrSize || + if (Sym.getAddress(Addr) || Addr == UnknownAddress || !(Sym.getFlags() & SymbolRef::SF_Global) || Sym.getSection(Section) || Section->isText() || Sym.getName(Name) || Name.size() == 0 || Name[0] == '\0') diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 8013f584239..b96d152f783 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -569,7 +569,7 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, continue; if ((I->TypeChar == 'U') && DefinedOnly) continue; - if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize) + if (SizeSort && !PrintAddress) continue; if (PrintFileName) { if (!ArchitectureName.empty()) @@ -586,16 +586,15 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, char SymbolAddrStr[18] = ""; char SymbolSizeStr[18] = ""; - if (OutputFormat == sysv || I->Address == UnknownAddressOrSize) + if (OutputFormat == sysv || I->Address == UnknownAddress) strcpy(SymbolAddrStr, printBlanks); if (OutputFormat == sysv) strcpy(SymbolSizeStr, printBlanks); - if (I->Address != UnknownAddressOrSize) + if (I->Address != UnknownAddress) format(printFormat, I->Address) .print(SymbolAddrStr, sizeof(SymbolAddrStr)); - if (I->Size != UnknownAddressOrSize) - format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr)); + format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr)); // If OutputFormat is darwin or we are printing Mach-O symbols in hex and // we have a MachOObjectFile, call darwinPrintSymbol to print as darwin's @@ -613,8 +612,7 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, outs() << SymbolAddrStr << ' '; if (PrintSize) { outs() << SymbolSizeStr; - if (I->Size != UnknownAddressOrSize) - outs() << ' '; + outs() << ' '; } outs() << I->TypeChar; if (I->TypeChar == '-' && MachO) @@ -930,11 +928,13 @@ static void dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName, if (Nsect && Nsect != getNsectInMachO(*MachO, I)) continue; NMSymbol S; - S.Size = UnknownAddressOrSize; - S.Address = UnknownAddressOrSize; - if (PrintSize && isa<ELFObjectFileBase>(Obj)) { - symbol_iterator SymI = I; - S.Size = SymI->getSize(); + S.Size = 0; + S.Address = UnknownAddress; + if (PrintSize) { + if (auto *E = dyn_cast<ELFObjectFileBase>(&Obj)) { + symbol_iterator SymI = I; + S.Size = E->getSymbolSize(*SymI); + } } if (PrintAddress && isa<ObjectFile>(Obj)) if (error(symbol_iterator(I)->getAddress(S.Address))) diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 1730bf3859f..bc743bcd067 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -2417,10 +2417,9 @@ static const char *get_pointer_32(uint32_t Address, uint32_t &offset, // for the specified section offset in the specified section reference. // If no relocation information is found and a non-zero ReferenceValue for the // symbol is passed, look up that address in the info's AddrMap. -static const char * -get_symbol_64(uint32_t sect_offset, SectionRef S, DisassembleInfo *info, - uint64_t &n_value, - uint64_t ReferenceValue = UnknownAddressOrSize) { +static const char *get_symbol_64(uint32_t sect_offset, SectionRef S, + DisassembleInfo *info, uint64_t &n_value, + uint64_t ReferenceValue = UnknownAddress) { n_value = 0; if (!info->verbose) return nullptr; @@ -2454,7 +2453,7 @@ get_symbol_64(uint32_t sect_offset, SectionRef S, DisassembleInfo *info, const char *SymbolName = nullptr; if (reloc_found && isExtern) { Symbol.getAddress(n_value); - if (n_value == UnknownAddressOrSize) + if (n_value == UnknownAddress) n_value = 0; StringRef name; Symbol.getName(name); @@ -2475,7 +2474,7 @@ get_symbol_64(uint32_t sect_offset, SectionRef S, DisassembleInfo *info, // We did not find an external relocation entry so look up the ReferenceValue // as an address of a symbol and if found return that symbol's name. - if (ReferenceValue != UnknownAddressOrSize) + if (ReferenceValue != UnknownAddress) SymbolName = GuessSymbolName(ReferenceValue, info->AddrMap); return SymbolName; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 8adbc70afc7..518d6de34fa 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -784,7 +784,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { uint64_t Address; if (error(Symbol.getAddress(Address))) break; - if (Address == UnknownAddressOrSize) + if (Address == UnknownAddress) continue; Address -= SectionAddr; if (Address >= SectSize) @@ -1101,9 +1101,9 @@ void llvm::PrintSymbolTable(const ObjectFile *o) { bool Hidden = Flags & SymbolRef::SF_Hidden; if (Common) - Address = Symbol.getSize(); + Address = Symbol.getCommonSize(); - if (Address == UnknownAddressOrSize) + if (Address == UnknownAddress) Address = 0; char GlobLoc = ' '; if (Type != SymbolRef::ST_Unknown) @@ -1149,7 +1149,8 @@ void llvm::PrintSymbolTable(const ObjectFile *o) { outs() << '\t'; if (Common || isa<ELFObjectFileBase>(o)) { - uint64_t Val = Common ? Symbol.getAlignment() : Symbol.getSize(); + uint64_t Val = Common ? Symbol.getAlignment() + : cast<ELFObjectFileBase>(o)->getSymbolSize(Symbol); outs() << format("\t %08" PRIx64 " ", Val); } diff --git a/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp b/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp index 448cfe99ddd..b6af342a0bc 100644 --- a/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ b/llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -94,7 +94,7 @@ void ModuleInfo::addSymbol(const SymbolRef &Symbol, DataExtractor *OpdExtractor, return; uint64_t SymbolAddress; if (error(Symbol.getAddress(SymbolAddress)) || - SymbolAddress == UnknownAddressOrSize) + SymbolAddress == UnknownAddress) return; if (OpdExtractor) { // For big-endian PowerPC64 ELF, symbols in the .opd section refer to @@ -109,15 +109,12 @@ void ModuleInfo::addSymbol(const SymbolRef &Symbol, DataExtractor *OpdExtractor, SymbolAddress = OpdExtractor->getAddress(&OpdOffset32); } uint64_t SymbolSize; - // Getting symbol size is linear for Mach-O files, so assume that symbol - // occupies the memory range up to the following symbol. - if (isa<MachOObjectFile>(Module)) + // Onyl ELF has a size for every symbol so assume that symbol occupies the + // memory range up to the following symbol. + if (auto *E = dyn_cast<ELFObjectFileBase>(Module)) + SymbolSize = E->getSymbolSize(Symbol); + else SymbolSize = 0; - else { - SymbolSize = Symbol.getSize(); - if (SymbolSize == UnknownAddressOrSize) - return; - } StringRef SymbolName; if (error(Symbol.getName(SymbolName))) return; |

