mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-22 03:39:03 +00:00
[llvm-symbolizer] Avoid calling slow getSymbolSize for Mach-O files. Assume that symbols with zero size are in fact large enough.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183213 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1c611ecdfd
commit
888ca964a4
@ -1,4 +1,5 @@
|
|||||||
RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input
|
RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input
|
||||||
|
RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400436" >> %t.input
|
||||||
RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input
|
RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input
|
||||||
RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input
|
RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input
|
||||||
RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x633" >> %t.input
|
RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x633" >> %t.input
|
||||||
@ -10,8 +11,12 @@ REQUIRES: shell
|
|||||||
|
|
||||||
CHECK: main
|
CHECK: main
|
||||||
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16
|
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16
|
||||||
|
|
||||||
|
CHECK: _start
|
||||||
|
|
||||||
CHECK: _Z1cv
|
CHECK: _Z1cv
|
||||||
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2
|
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2
|
||||||
|
|
||||||
CHECK: inlined_h
|
CHECK: inlined_h
|
||||||
CHECK-NEXT: dwarfdump-inl-test.h:2
|
CHECK-NEXT: dwarfdump-inl-test.h:2
|
||||||
CHECK-NEXT: inlined_g
|
CHECK-NEXT: inlined_g
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/Object/MachO.h"
|
#include "llvm/Object/MachO.h"
|
||||||
#include "llvm/Support/Casting.h"
|
#include "llvm/Support/Casting.h"
|
||||||
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/Path.h"
|
#include "llvm/Support/Path.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -63,7 +64,11 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
|
|||||||
SymbolAddress == UnknownAddressOrSize)
|
SymbolAddress == UnknownAddressOrSize)
|
||||||
continue;
|
continue;
|
||||||
uint64_t SymbolSize;
|
uint64_t SymbolSize;
|
||||||
if (error(si->getSize(SymbolSize)) || SymbolSize == UnknownAddressOrSize)
|
// Getting symbol size is linear for Mach-O files, so avoid it.
|
||||||
|
if (isa<MachOObjectFile>(Obj))
|
||||||
|
SymbolSize = 0;
|
||||||
|
else if (error(si->getSize(SymbolSize)) ||
|
||||||
|
SymbolSize == UnknownAddressOrSize)
|
||||||
continue;
|
continue;
|
||||||
StringRef SymbolName;
|
StringRef SymbolName;
|
||||||
if (error(si->getName(SymbolName)))
|
if (error(si->getName(SymbolName)))
|
||||||
@ -80,11 +85,14 @@ bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
|
|||||||
std::string &Name, uint64_t &Addr,
|
std::string &Name, uint64_t &Addr,
|
||||||
uint64_t &Size) const {
|
uint64_t &Size) const {
|
||||||
const SymbolMapTy &M = Type == SymbolRef::ST_Function ? Functions : Objects;
|
const SymbolMapTy &M = Type == SymbolRef::ST_Function ? Functions : Objects;
|
||||||
SymbolDesc SD = { Address, Address + 1 };
|
if (M.empty())
|
||||||
SymbolMapTy::const_iterator it = M.find(SD);
|
|
||||||
if (it == M.end())
|
|
||||||
return false;
|
return false;
|
||||||
if (Address < it->first.Addr || Address >= it->first.AddrEnd)
|
SymbolDesc SD = { Address, Address };
|
||||||
|
SymbolMapTy::const_iterator it = M.upper_bound(SD);
|
||||||
|
--it;
|
||||||
|
// Assume that symbols with zero size are large enough.
|
||||||
|
if (it->first.Addr < it->first.AddrEnd &&
|
||||||
|
it->first.AddrEnd <= Address)
|
||||||
return false;
|
return false;
|
||||||
Name = it->second.str();
|
Name = it->second.str();
|
||||||
Addr = it->first.Addr;
|
Addr = it->first.Addr;
|
||||||
@ -236,9 +244,12 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) {
|
|||||||
if (isa<MachOObjectFile>(Obj)) {
|
if (isa<MachOObjectFile>(Obj)) {
|
||||||
const std::string &ResourceName =
|
const std::string &ResourceName =
|
||||||
getDarwinDWARFResourceForModule(ModuleName);
|
getDarwinDWARFResourceForModule(ModuleName);
|
||||||
ObjectFile *ResourceObj = getObjectFile(ResourceName);
|
bool ResourceFileExists = false;
|
||||||
if (ResourceObj != 0)
|
if (!sys::fs::exists(ResourceName, ResourceFileExists) &&
|
||||||
DbgObj = ResourceObj;
|
ResourceFileExists) {
|
||||||
|
if (ObjectFile *ResourceObj = getObjectFile(ResourceName))
|
||||||
|
DbgObj = ResourceObj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Context = DIContext::getDWARFContext(DbgObj);
|
Context = DIContext::getDWARFContext(DbgObj);
|
||||||
assert(Context);
|
assert(Context);
|
||||||
|
@ -84,7 +84,7 @@ private:
|
|||||||
uint64_t Addr;
|
uint64_t Addr;
|
||||||
uint64_t AddrEnd;
|
uint64_t AddrEnd;
|
||||||
friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
|
friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
|
||||||
return s1.AddrEnd <= s2.Addr;
|
return s1.Addr < s2.Addr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
typedef std::map<SymbolDesc, StringRef> SymbolMapTy;
|
typedef std::map<SymbolDesc, StringRef> SymbolMapTy;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user