Index: docs/CommandGuide/llvm-symbolizer.rst =================================================================== --- docs/CommandGuide/llvm-symbolizer.rst +++ docs/CommandGuide/llvm-symbolizer.rst @@ -92,6 +92,10 @@ input (see example above). If architecture is not specified in either way, address will not be symbolized. Defaults to empty string. +.. option:: -address + + Print address before the source code location. Defaults to false. + .. option:: -dsym-hint= (Darwin-only flag). If the debug info for a binary isn't present in the default Index: test/tools/llvm-symbolizer/Inputs/addr.inp =================================================================== --- /dev/null +++ test/tools/llvm-symbolizer/Inputs/addr.inp @@ -0,0 +1,2 @@ +0x4003e5 +0x4004f0 Index: test/tools/llvm-symbolizer/addr.test =================================================================== --- /dev/null +++ test/tools/llvm-symbolizer/addr.test @@ -0,0 +1,8 @@ +RUN: llvm-symbolizer -address -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck %s + +CHECK: {{[0x]+}}4003e5 +CHECK: main +CHECK: /tmp/x.c:11:0 +CHECK: {{[0x]+}}4004f0 +CHECK: foo +CHECK: /tmp/x.c:3 Index: tools/llvm-symbolizer/LLVMSymbolize.h =================================================================== --- tools/llvm-symbolizer/LLVMSymbolize.h +++ tools/llvm-symbolizer/LLVMSymbolize.h @@ -40,15 +40,17 @@ bool PrintInlining : 1; bool Demangle : 1; bool RelativeAddresses : 1; + bool PrintAddress : 1; std::string DefaultArch; std::vector DsymHints; Options(FunctionNameKind PrintFunctions = FunctionNameKind::LinkageName, bool UseSymbolTable = true, bool PrintInlining = true, bool Demangle = true, bool RelativeAddresses = false, - std::string DefaultArch = "") + std::string DefaultArch = "", bool PrintAddress = false) : PrintFunctions(PrintFunctions), UseSymbolTable(UseSymbolTable), PrintInlining(PrintInlining), Demangle(Demangle), - RelativeAddresses(RelativeAddresses), DefaultArch(DefaultArch) {} + RelativeAddresses(RelativeAddresses), PrintAddress(PrintAddress), + DefaultArch(DefaultArch) {} }; LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {} Index: tools/llvm-symbolizer/LLVMSymbolize.cpp =================================================================== --- tools/llvm-symbolizer/LLVMSymbolize.cpp +++ tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -28,6 +28,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" #include #include @@ -102,7 +103,7 @@ // of the function's code, not the descriptor. uint64_t OpdOffset = SymbolAddress - OpdAddress; uint32_t OpdOffset32 = OpdOffset; - if (OpdOffset == OpdOffset32 && + if (OpdOffset == OpdOffset32 && OpdExtractor->isValidOffsetForAddress(OpdOffset32)) SymbolAddress = OpdExtractor->getAddress(&OpdOffset32); } @@ -210,12 +211,18 @@ ModuleInfo *Info = getOrCreateModuleInfo(ModuleName); if (!Info) return printDILineInfo(DILineInfo(), Info); + std::string Result; + if (Opts.PrintAddress) { + std::string hexStr = "0x"; + raw_string_ostream ss(hexStr); + ss.write_hex(ModuleOffset); + Result = ss.str(); + } if (Opts.PrintInlining) { DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(ModuleOffset, Opts); uint32_t FramesNum = InlinedContext.getNumberOfFrames(); assert(FramesNum > 0); - std::string Result; for (uint32_t i = 0; i < FramesNum; i++) { DILineInfo LineInfo = InlinedContext.getFrame(i); Result += printDILineInfo(LineInfo, Info); @@ -223,7 +230,8 @@ return Result; } DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts); - return printDILineInfo(LineInfo, Info); + Result += printDILineInfo(LineInfo, Info); + return Result; } std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName, @@ -369,7 +377,7 @@ if (!MachDbgObj) continue; if (darwinDsymMatchesBinary(MachDbgObj, MachExeObj)) { addOwningBinary(std::move(B)); - return DbgObj; + return DbgObj; } } } Index: tools/llvm-symbolizer/llvm-symbolizer.cpp =================================================================== --- tools/llvm-symbolizer/llvm-symbolizer.cpp +++ tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -52,6 +52,9 @@ ClUseRelativeAddress("relative-address", cl::init(false), cl::desc("Interpret addresses as relative addresses"), cl::ReallyHidden); +static cl::opt + ClAddress("address", cl::init(false), + cl::desc("Show address before line information")); static cl::opt ClPrintInlining("inlining", cl::init(true), @@ -134,7 +137,7 @@ cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n"); LLVMSymbolizer::Options Opts(ClPrintFunctions, ClUseSymbolTable, ClPrintInlining, ClDemangle, - ClUseRelativeAddress, ClDefaultArch); + ClUseRelativeAddress, ClDefaultArch, ClAddress); for (const auto &hint : ClDsymHint) { if (sys::path::extension(hint) == ".dSYM") { Opts.DsymHints.push_back(hint);