Skip to content

Commit

Permalink
llvm-symbolizer: Untag addresses in object files by default.
Browse files Browse the repository at this point in the history
Any addresses that we pass to llvm-symbolizer are going to be untagged,
while any HWASAN instrumented globals are going to be tagged in the
symbol table. Therefore we need to untag the addresses before using them.

Differential Revision: https://reviews.llvm.org/D65769

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367926 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
pcc committed Aug 5, 2019
1 parent 8530382 commit 7f8c512
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 8 deletions.
1 change: 1 addition & 0 deletions include/llvm/DebugInfo/Symbolize/Symbolize.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class LLVMSymbolizer {
bool UseSymbolTable = true;
bool Demangle = true;
bool RelativeAddresses = false;
bool UntagAddresses = false;
std::string DefaultArch;
std::vector<std::string> DsymHints;
std::string FallbackDebugPath;
Expand Down
16 changes: 12 additions & 4 deletions lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@ getDILineInfoSpecifier(FunctionNameKind FNKind) {

ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
SymbolizableObjectFile::create(const object::ObjectFile *Obj,
std::unique_ptr<DIContext> DICtx) {
std::unique_ptr<DIContext> DICtx,
bool UntagAddresses) {
assert(DICtx);
std::unique_ptr<SymbolizableObjectFile> res(
new SymbolizableObjectFile(Obj, std::move(DICtx)));
new SymbolizableObjectFile(Obj, std::move(DICtx), UntagAddresses));
std::unique_ptr<DataExtractor> OpdExtractor;
uint64_t OpdAddress = 0;
// Find the .opd (function descriptor) section if any, for big-endian
Expand Down Expand Up @@ -103,8 +104,10 @@ SymbolizableObjectFile::create(const object::ObjectFile *Obj,
}

SymbolizableObjectFile::SymbolizableObjectFile(const ObjectFile *Obj,
std::unique_ptr<DIContext> DICtx)
: Module(Obj), DebugInfoContext(std::move(DICtx)) {}
std::unique_ptr<DIContext> DICtx,
bool UntagAddresses)
: Module(Obj), DebugInfoContext(std::move(DICtx)),
UntagAddresses(UntagAddresses) {}

namespace {

Expand Down Expand Up @@ -172,6 +175,11 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol,
if (!SymbolAddressOrErr)
return errorToErrorCode(SymbolAddressOrErr.takeError());
uint64_t SymbolAddress = *SymbolAddressOrErr;
if (UntagAddresses) {
// For kernel addresses, bits 56-63 need to be set, so we sign extend bit 55
// into bits 56-63 instead of masking them out.
SymbolAddress = (int64_t(SymbolAddress) << 8) >> 8;
}
if (OpdExtractor) {
// For big-endian PowerPC64 ELF, symbols in the .opd section refer to
// function descriptors. The first word of the descriptor is a pointer to
Expand Down
7 changes: 5 additions & 2 deletions lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ namespace symbolize {
class SymbolizableObjectFile : public SymbolizableModule {
public:
static ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx,
bool UntagAddresses);

DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind,
Expand Down Expand Up @@ -70,6 +71,7 @@ class SymbolizableObjectFile : public SymbolizableModule {

const object::ObjectFile *Module;
std::unique_ptr<DIContext> DebugInfoContext;
bool UntagAddresses;

struct SymbolDesc {
uint64_t Addr;
Expand All @@ -85,7 +87,8 @@ class SymbolizableObjectFile : public SymbolizableModule {
std::vector<std::pair<SymbolDesc, StringRef>> Objects;

SymbolizableObjectFile(const object::ObjectFile *Obj,
std::unique_ptr<DIContext> DICtx);
std::unique_ptr<DIContext> DICtx,
bool UntagAddresses);
};

} // end namespace symbolize
Expand Down
4 changes: 2 additions & 2 deletions lib/DebugInfo/Symbolize/Symbolize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,8 +418,8 @@ Expected<SymbolizableModule *>
LLVMSymbolizer::createModuleInfo(const ObjectFile *Obj,
std::unique_ptr<DIContext> Context,
StringRef ModuleName) {
auto InfoOrErr =
SymbolizableObjectFile::create(Obj, std::move(Context));
auto InfoOrErr = SymbolizableObjectFile::create(Obj, std::move(Context),
Opts.UntagAddresses);
std::unique_ptr<SymbolizableModule> SymMod;
if (InfoOrErr)
SymMod = std::move(*InfoOrErr);
Expand Down
16 changes: 16 additions & 0 deletions test/tools/llvm-symbolizer/untag-addresses.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: echo DATA %t.o 0 | llvm-symbolizer | FileCheck --check-prefix=UNTAG %s
# RUN: echo DATA %t.o 0 | llvm-symbolizer -untag-addresses=0 | FileCheck --check-prefix=NOUNTAG %s
# RUN: echo DATA %t.o 0 | llvm-addr2line | FileCheck --check-prefix=NOUNTAG %s

# UNTAG: foo
# UNTAG: 0 4
# NOUNTAG: ??
# NOUNTAG: 0 0

.data
.globl foo
.type foo, @object
.size foo, 4
foo = . + 0x1100000000000000
.4byte 1
6 changes: 6 additions & 0 deletions tools/llvm-symbolizer/llvm-symbolizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ static cl::opt<bool>
cl::desc("Interpret addresses as relative addresses"),
cl::ReallyHidden);

static cl::opt<bool> ClUntagAddresses(
"untag-addresses", cl::init(true),
cl::desc("Remove memory tags from addresses before symbolization"));

static cl::opt<bool>
ClPrintInlining("inlining", cl::init(true),
cl::desc("Print all inlined frames for a given address"));
Expand Down Expand Up @@ -274,6 +278,7 @@ int main(int argc, char **argv) {
ClDemangle.setInitialValue(false);
ClPrintFunctions.setInitialValue(FunctionNameKind::None);
ClPrintInlining.setInitialValue(false);
ClUntagAddresses.setInitialValue(false);
ClOutputStyle.setInitialValue(DIPrinter::OutputStyle::GNU);
}

Expand All @@ -290,6 +295,7 @@ int main(int argc, char **argv) {
Opts.UseSymbolTable = ClUseSymbolTable;
Opts.Demangle = ClDemangle;
Opts.RelativeAddresses = ClUseRelativeAddress;
Opts.UntagAddresses = ClUntagAddresses;
Opts.DefaultArch = ClDefaultArch;
Opts.FallbackDebugPath = ClFallbackDebugPath;
Opts.DWPName = ClDwpName;
Expand Down

0 comments on commit 7f8c512

Please sign in to comment.