diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2019-08-05 20:59:25 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2019-08-05 20:59:25 +0000 |
commit | a56d81f4fb034eaf8fd9f9e216cf65d40a275364 (patch) | |
tree | 0e0fdea619916a816a15be22864f049d90a4492f /llvm/lib/DebugInfo | |
parent | 1d92925a5ad8869d208fcbfb3c093e9dee016ddc (diff) | |
download | bcm5719-llvm-a56d81f4fb034eaf8fd9f9e216cf65d40a275364.tar.gz bcm5719-llvm-a56d81f4fb034eaf8fd9f9e216cf65d40a275364.zip |
llvm-symbolizer: Untag addresses in object files by default.
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
llvm-svn: 367926
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h | 7 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/Symbolize.cpp | 4 |
3 files changed, 19 insertions, 8 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index 2765bf44d50..03c5c6b8e10 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -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 @@ -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 { @@ -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 diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index 9cab94178c1..b5b9793a44d 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -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, @@ -70,6 +71,7 @@ private: const object::ObjectFile *Module; std::unique_ptr<DIContext> DebugInfoContext; + bool UntagAddresses; struct SymbolDesc { uint64_t Addr; @@ -85,7 +87,8 @@ private: 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 diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index 6a619f8f2f3..51aa0d781f6 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -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); |