diff --git a/llvm/test/tools/llvm-xray/AArch64/extract-instrmap-aarch64-mangled.test b/llvm/test/tools/llvm-xray/AArch64/extract-instrmap-aarch64-mangled.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-xray/AArch64/extract-instrmap-aarch64-mangled.test @@ -0,0 +1,14 @@ +This test makes sure we can extract the instrumentation map from an +XRay-instrumented PIE file. + +RUN: yaml2obj %S/Inputs/elf64-pic.yaml -o %t.so +RUN: llvm-xray extract --symbolize-mangled %t.so | FileCheck %s + +CHECK: --- +CHECK-NEXT: - { id: 1, address: 0x0000000000000420, function: 0x0000000000000420, kind: function-enter, always-instrument: true, function-name: _Z3foov } +CHECK-NEXT: - { id: 1, address: 0x0000000000000440, function: 0x0000000000000420, kind: function-exit, always-instrument: true, function-name: _Z3foov } +CHECK-NEXT: - { id: 2, address: 0x0000000000000464, function: 0x0000000000000464, kind: function-enter, always-instrument: true, function-name: _Z3barv } +CHECK-NEXT: - { id: 2, address: 0x0000000000000484, function: 0x0000000000000464, kind: function-exit, always-instrument: true, function-name: _Z3barv } +CHECK-NEXT: - { id: 3, address: 0x00000000000004A8, function: 0x00000000000004A8, kind: function-enter, always-instrument: true, function-name: _Z3jarv } +CHECK-NEXT: - { id: 3, address: 0x00000000000004C8, function: 0x00000000000004A8, kind: function-exit, always-instrument: true, function-name: _Z3jarv } +CHECK-NEXT: ... diff --git a/llvm/tools/llvm-xray/xray-extract.cpp b/llvm/tools/llvm-xray/xray-extract.cpp --- a/llvm/tools/llvm-xray/xray-extract.cpp +++ b/llvm/tools/llvm-xray/xray-extract.cpp @@ -45,6 +45,13 @@ cl::sub(Extract)); static cl::alias ExtractSymbolize2("s", cl::aliasopt(ExtractSymbolize), cl::desc("alias for -symbolize")); +static cl::opt ExtractSymbolizeMangled( + "symbolize-mangled", cl::value_desc("symbolize-mangled"), cl::init(false), + cl::desc("symbolize with mangled symbols"), cl::sub(Extract)); +static cl::alias + ExtractSymbolizeMangled2("m", cl::aliasopt(ExtractSymbolize), + cl::desc("alias for --symbolize-mangled"), + cl::sub(Extract)); namespace { @@ -60,7 +67,9 @@ return; YAMLSleds.push_back({*FuncId, Sled.Address, Sled.Function, Sled.Kind, Sled.AlwaysInstrument, - ExtractSymbolize ? FH.SymbolOrNumber(*FuncId) : ""}); + (ExtractSymbolize || ExtractSymbolizeMangled) + ? FH.SymbolOrNumber(*FuncId) + : ""}); } Output Out(OS, nullptr, 0); Out << YAMLSleds; @@ -84,7 +93,11 @@ Twine("Cannot open file '") + ExtractOutput + "' for writing.", EC); const auto &FunctionAddresses = InstrumentationMapOrError->getFunctionAddresses(); - symbolize::LLVMSymbolizer Symbolizer; + symbolize::LLVMSymbolizer::Options opts; + if (ExtractSymbolizeMangled) { + opts.Demangle = false; + } + symbolize::LLVMSymbolizer Symbolizer(opts); llvm::xray::FuncIdConversionHelper FuncIdHelper(ExtractInput, Symbolizer, FunctionAddresses); exportAsYAML(*InstrumentationMapOrError, OS, FuncIdHelper);