summaryrefslogtreecommitdiff
path: root/tools/llvm-symbolizer
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-symbolizer')
-rw-r--r--tools/llvm-symbolizer/LLVMSymbolize.cpp84
-rw-r--r--tools/llvm-symbolizer/LLVMSymbolize.h43
-rw-r--r--tools/llvm-symbolizer/llvm-symbolizer.cpp20
3 files changed, 69 insertions, 78 deletions
diff --git a/tools/llvm-symbolizer/LLVMSymbolize.cpp b/tools/llvm-symbolizer/LLVMSymbolize.cpp
index fe32178f02..86ea34bff6 100644
--- a/tools/llvm-symbolizer/LLVMSymbolize.cpp
+++ b/tools/llvm-symbolizer/LLVMSymbolize.cpp
@@ -22,13 +22,14 @@ namespace llvm {
namespace symbolize {
static bool error(error_code ec) {
- if (!ec) return false;
+ if (!ec)
+ return false;
errs() << "LLVMSymbolizer: error reading file: " << ec.message() << ".\n";
return true;
}
-static uint32_t getDILineInfoSpecifierFlags(
- const LLVMSymbolizer::Options &Opts) {
+static uint32_t
+getDILineInfoSpecifierFlags(const LLVMSymbolizer::Options &Opts) {
uint32_t Flags = llvm::DILineInfoSpecifier::FileLineInfo |
llvm::DILineInfoSpecifier::AbsoluteFilePath;
if (Opts.PrintFunctions)
@@ -44,36 +45,32 @@ static void patchFunctionNameInDILineInfo(const std::string &NewFunctionName,
}
ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
- : Module(Obj)
- , DebugInfoContext(DICtx) {
+ : Module(Obj), DebugInfoContext(DICtx) {
error_code ec;
- for (symbol_iterator si = Module->begin_symbols(),
- se = Module->end_symbols();
- si != se; si.increment(ec)) {
+ for (symbol_iterator si = Module->begin_symbols(), se = Module->end_symbols();
+ si != se; si.increment(ec)) {
if (error(ec))
return;
SymbolRef::Type SymbolType;
if (error(si->getType(SymbolType)))
continue;
- if (SymbolType != SymbolRef::ST_Function
- && SymbolType != SymbolRef::ST_Data)
+ if (SymbolType != SymbolRef::ST_Function &&
+ SymbolType != SymbolRef::ST_Data)
continue;
uint64_t SymbolAddress;
- if (error(si->getAddress(SymbolAddress))
- || SymbolAddress == UnknownAddressOrSize)
+ if (error(si->getAddress(SymbolAddress)) ||
+ SymbolAddress == UnknownAddressOrSize)
continue;
uint64_t SymbolSize;
- if (error(si->getSize(SymbolSize))
- || SymbolSize == UnknownAddressOrSize)
+ if (error(si->getSize(SymbolSize)) || SymbolSize == UnknownAddressOrSize)
continue;
StringRef SymbolName;
if (error(si->getName(SymbolName)))
continue;
// FIXME: If a function has alias, there are two entries in symbol table
// with same address size. Make sure we choose the correct one.
- SymbolMapTy &M = SymbolType == SymbolRef::ST_Function ?
- Functions : Objects;
- SymbolDesc SD = {SymbolAddress, SymbolAddress + SymbolSize};
+ SymbolMapTy &M = SymbolType == SymbolRef::ST_Function ? Functions : Objects;
+ SymbolDesc SD = { SymbolAddress, SymbolAddress + SymbolSize };
M.insert(std::make_pair(SD, SymbolName));
}
}
@@ -81,9 +78,8 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
std::string &Name, uint64_t &Addr,
uint64_t &Size) const {
- const SymbolMapTy& M = Type == SymbolRef::ST_Function ?
- Functions : Objects;
- SymbolDesc SD = {Address, Address + 1};
+ const SymbolMapTy &M = Type == SymbolRef::ST_Function ? Functions : Objects;
+ SymbolDesc SD = { Address, Address + 1 };
SymbolMapTy::const_iterator it = M.find(SD);
if (it == M.end())
return false;
@@ -95,8 +91,8 @@ bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
return true;
}
-DILineInfo ModuleInfo::symbolizeCode(uint64_t ModuleOffset,
- const LLVMSymbolizer::Options& Opts) const {
+DILineInfo ModuleInfo::symbolizeCode(
+ uint64_t ModuleOffset, const LLVMSymbolizer::Options &Opts) const {
DILineInfo LineInfo;
if (DebugInfoContext) {
LineInfo = DebugInfoContext->getLineInfoForAddress(
@@ -106,16 +102,16 @@ DILineInfo ModuleInfo::symbolizeCode(uint64_t ModuleOffset,
if (Opts.PrintFunctions && Opts.UseSymbolTable) {
std::string FunctionName;
uint64_t Start, Size;
- if (getNameFromSymbolTable(SymbolRef::ST_Function,
- ModuleOffset, FunctionName, Start, Size)) {
+ if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset,
+ FunctionName, Start, Size)) {
patchFunctionNameInDILineInfo(FunctionName, LineInfo);
}
}
return LineInfo;
}
-DIInliningInfo ModuleInfo::symbolizeInlinedCode(uint64_t ModuleOffset,
- const LLVMSymbolizer::Options& Opts) const {
+DIInliningInfo ModuleInfo::symbolizeInlinedCode(
+ uint64_t ModuleOffset, const LLVMSymbolizer::Options &Opts) const {
DIInliningInfo InlinedContext;
if (DebugInfoContext) {
InlinedContext = DebugInfoContext->getInliningInfoForAddress(
@@ -128,14 +124,13 @@ DIInliningInfo ModuleInfo::symbolizeInlinedCode(uint64_t ModuleOffset,
// Override the function name in lower frame with name from symbol table.
if (Opts.PrintFunctions && Opts.UseSymbolTable) {
DIInliningInfo PatchedInlinedContext;
- for (uint32_t i = 0, n = InlinedContext.getNumberOfFrames();
- i < n; i++) {
+ for (uint32_t i = 0, n = InlinedContext.getNumberOfFrames(); i < n; i++) {
DILineInfo LineInfo = InlinedContext.getFrame(i);
if (i == n - 1) {
std::string FunctionName;
uint64_t Start, Size;
- if (getNameFromSymbolTable(SymbolRef::ST_Function,
- ModuleOffset, FunctionName, Start, Size)) {
+ if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset,
+ FunctionName, Start, Size)) {
patchFunctionNameInDILineInfo(FunctionName, LineInfo);
}
}
@@ -148,8 +143,8 @@ DIInliningInfo ModuleInfo::symbolizeInlinedCode(uint64_t ModuleOffset,
bool ModuleInfo::symbolizeData(uint64_t ModuleOffset, std::string &Name,
uint64_t &Start, uint64_t &Size) const {
- return getNameFromSymbolTable(SymbolRef::ST_Data,
- ModuleOffset, Name, Start, Size);
+ return getNameFromSymbolTable(SymbolRef::ST_Data, ModuleOffset, Name, Start,
+ Size);
}
const char LLVMSymbolizer::kBadString[] = "??";
@@ -160,8 +155,8 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
if (Info == 0)
return printDILineInfo(DILineInfo());
if (Opts.PrintInlining) {
- DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
- ModuleOffset, Opts);
+ DIInliningInfo InlinedContext =
+ Info->symbolizeInlinedCode(ModuleOffset, Opts);
uint32_t FramesNum = InlinedContext.getNumberOfFrames();
assert(FramesNum > 0);
std::string Result;
@@ -192,8 +187,7 @@ std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName,
}
// Returns true if the object endianness is known.
-static bool getObjectEndianness(const ObjectFile *Obj,
- bool &IsLittleEndian) {
+static bool getObjectEndianness(const ObjectFile *Obj, bool &IsLittleEndian) {
// FIXME: Implement this when libLLVMObject allows to do it easily.
IsLittleEndian = true;
return true;
@@ -215,8 +209,8 @@ static std::string getDarwinDWARFResourceForModule(const std::string &Path) {
return ResourceName.str();
}
-ModuleInfo *LLVMSymbolizer::getOrCreateModuleInfo(
- const std::string &ModuleName) {
+ModuleInfo *
+LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) {
ModuleMapTy::iterator I = Modules.find(ModuleName);
if (I != Modules.end())
return I->second;
@@ -224,7 +218,7 @@ ModuleInfo *LLVMSymbolizer::getOrCreateModuleInfo(
ObjectFile *Obj = getObjectFile(ModuleName);
if (Obj == 0) {
// Module name doesn't point to a valid object file.
- Modules.insert(make_pair(ModuleName, (ModuleInfo*)0));
+ Modules.insert(make_pair(ModuleName, (ModuleInfo *)0));
return 0;
}
@@ -235,8 +229,8 @@ ModuleInfo *LLVMSymbolizer::getOrCreateModuleInfo(
// resource directory.
ObjectFile *DbgObj = Obj;
if (isa<MachOObjectFile>(Obj)) {
- const std::string &ResourceName = getDarwinDWARFResourceForModule(
- ModuleName);
+ const std::string &ResourceName =
+ getDarwinDWARFResourceForModule(ModuleName);
ObjectFile *ResourceObj = getObjectFile(ResourceName);
if (ResourceObj != 0)
DbgObj = ResourceObj;
@@ -265,8 +259,8 @@ std::string LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo) const {
std::string Filename = LineInfo.getFileName();
if (Filename == kDILineInfoBadString)
Filename = kBadString;
- Result << Filename << ":" << LineInfo.getLine()
- << ":" << LineInfo.getColumn() << "\n";
+ Result << Filename << ":" << LineInfo.getLine() << ":" << LineInfo.getColumn()
+ << "\n";
return Result.str();
}
@@ -289,5 +283,5 @@ void LLVMSymbolizer::DemangleName(std::string &Name) const {
#endif
}
-} // namespace symbolize
-} // namespace llvm
+} // namespace symbolize
+} // namespace llvm
diff --git a/tools/llvm-symbolizer/LLVMSymbolize.h b/tools/llvm-symbolizer/LLVMSymbolize.h
index 1755e1dc88..e6220aa4ce 100644
--- a/tools/llvm-symbolizer/LLVMSymbolize.h
+++ b/tools/llvm-symbolizer/LLVMSymbolize.h
@@ -30,50 +30,49 @@ class ModuleInfo;
class LLVMSymbolizer {
public:
- struct Options {
+ struct Options {
bool UseSymbolTable : 1;
bool PrintFunctions : 1;
bool PrintInlining : 1;
bool Demangle : 1;
Options(bool UseSymbolTable = true, bool PrintFunctions = true,
bool PrintInlining = true, bool Demangle = true)
- : UseSymbolTable(UseSymbolTable),
- PrintFunctions(PrintFunctions),
- PrintInlining(PrintInlining),
- Demangle(Demangle) { }
+ : UseSymbolTable(UseSymbolTable), PrintFunctions(PrintFunctions),
+ PrintInlining(PrintInlining), Demangle(Demangle) {
+ }
};
- LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) { }
+ LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {}
// Returns the result of symbolization for module name/offset as
// a string (possibly containing newlines).
- std::string symbolizeCode(const std::string &ModuleName,
- uint64_t ModuleOffset);
- std::string symbolizeData(const std::string &ModuleName,
- uint64_t ModuleOffset);
+ std::string
+ symbolizeCode(const std::string &ModuleName, uint64_t ModuleOffset);
+ std::string
+ symbolizeData(const std::string &ModuleName, uint64_t ModuleOffset);
private:
ModuleInfo *getOrCreateModuleInfo(const std::string &ModuleName);
std::string printDILineInfo(DILineInfo LineInfo) const;
void DemangleName(std::string &Name) const;
- typedef std::map<std::string, ModuleInfo*> ModuleMapTy;
+ typedef std::map<std::string, ModuleInfo *> ModuleMapTy;
ModuleMapTy Modules;
Options Opts;
static const char kBadString[];
};
class ModuleInfo {
- public:
+public:
ModuleInfo(ObjectFile *Obj, DIContext *DICtx);
- DILineInfo symbolizeCode(
- uint64_t ModuleOffset, const LLVMSymbolizer::Options& Opts) const;
+ DILineInfo symbolizeCode(uint64_t ModuleOffset,
+ const LLVMSymbolizer::Options &Opts) const;
DIInliningInfo symbolizeInlinedCode(
- uint64_t ModuleOffset, const LLVMSymbolizer::Options& Opts) const;
- bool symbolizeData(uint64_t ModuleOffset, std::string &Name,
- uint64_t &Start, uint64_t &Size) const;
+ uint64_t ModuleOffset, const LLVMSymbolizer::Options &Opts) const;
+ bool symbolizeData(uint64_t ModuleOffset, std::string &Name, uint64_t &Start,
+ uint64_t &Size) const;
- private:
+private:
bool getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
std::string &Name, uint64_t &Addr,
uint64_t &Size) const;
@@ -83,7 +82,7 @@ class ModuleInfo {
struct SymbolDesc {
uint64_t Addr;
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;
}
};
@@ -92,7 +91,7 @@ class ModuleInfo {
SymbolMapTy Objects;
};
-} // namespace symbolize
-} // namespace llvm
+} // namespace symbolize
+} // namespace llvm
-#endif // LLVM_SYMBOLIZE_H
+#endif // LLVM_SYMBOLIZE_H
diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 819f1f8475..d039ec691f 100644
--- a/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -32,24 +32,22 @@ using namespace symbolize;
static cl::opt<bool>
ClUseSymbolTable("use-symbol-table", cl::init(true),
- cl::desc("Prefer names in symbol table to names "
- "in debug info"));
+ cl::desc("Prefer names in symbol table to names "
+ "in debug info"));
static cl::opt<bool>
ClPrintFunctions("functions", cl::init(true),
- cl::desc("Print function names as well as line "
- "information for a given address"));
+ cl::desc("Print function names as well as line "
+ "information for a given address"));
static cl::opt<bool>
ClPrintInlining("inlining", cl::init(true),
- cl::desc("Print all inlined frames for a given address"));
+ cl::desc("Print all inlined frames for a given address"));
static cl::opt<bool>
-ClDemangle("demangle", cl::init(true),
- cl::desc("Demangle function names"));
+ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names"));
-static bool parseCommand(bool &IsData,
- std::string &ModuleName,
+static bool parseCommand(bool &IsData, std::string &ModuleName,
uint64_t &ModuleOffset) {
const char *kDataCmd = "DATA ";
const char *kCodeCmd = "CODE ";
@@ -75,7 +73,7 @@ static bool parseCommand(bool &IsData,
// FIXME: Handle case when filename is given in quotes.
if (char *FilePath = strtok(pos, kDelimiters)) {
ModuleName = FilePath;
- if (char *OffsetStr = strtok((char*)0, kDelimiters))
+ if (char *OffsetStr = strtok((char *)0, kDelimiters))
ModuleOffsetStr = OffsetStr;
}
if (StringRef(ModuleOffsetStr).getAsInteger(0, ModuleOffset))
@@ -87,7 +85,7 @@ int main(int argc, char **argv) {
// Print stack trace if we signal out.
sys::PrintStackTraceOnErrorSignal();
PrettyStackTraceProgram X(argc, argv);
- llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
+ llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
cl::ParseCommandLineOptions(argc, argv, "llvm symbolizer for compiler-rt\n");
LLVMSymbolizer::Options Opts(ClUseSymbolTable, ClPrintFunctions,