mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-24 08:39:13 +00:00
Add option to symbolize inline frames for InternalSymbolizer
Summary: Currently, there is no way to let the `InternalSymbolizer` implemented functions know if inline frames should be symbolized. This patch updates the function `__sanitizer_symbolize_code` to include a parameter for this ASAN option and toggle between LLVM symbolization functions when appropriate. Fixes the following two failing tests when internal symbolization is enabled: ``` SanitizerCommon-*-x86_64-Linux :: print-stack-trace.cpp SanitizerCommon-*-x86_64-Linux :: symbolize_pc_inline.cpp ``` Reviewers: vitalybuka, kcc, filcab Reviewed By: vitalybuka Subscribers: #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D79280
This commit is contained in:
parent
b5740105d2
commit
8df3e1fd86
@ -321,9 +321,10 @@ class Addr2LinePool : public SymbolizerTool {
|
||||
|
||||
#if SANITIZER_SUPPORTS_WEAK_HOOKS
|
||||
extern "C" {
|
||||
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
|
||||
bool __sanitizer_symbolize_code(const char *ModuleName, u64 ModuleOffset,
|
||||
char *Buffer, int MaxLength);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE bool
|
||||
__sanitizer_symbolize_code(const char *ModuleName, u64 ModuleOffset,
|
||||
char *Buffer, int MaxLength,
|
||||
bool SymbolizeInlineFrames);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
|
||||
bool __sanitizer_symbolize_data(const char *ModuleName, u64 ModuleOffset,
|
||||
char *Buffer, int MaxLength);
|
||||
@ -346,7 +347,8 @@ class InternalSymbolizer : public SymbolizerTool {
|
||||
|
||||
bool SymbolizePC(uptr addr, SymbolizedStack *stack) override {
|
||||
bool result = __sanitizer_symbolize_code(
|
||||
stack->info.module, stack->info.module_offset, buffer_, kBufferSize);
|
||||
stack->info.module, stack->info.module_offset, buffer_, kBufferSize,
|
||||
common_flags()->symbolize_inline_frames);
|
||||
if (result) ParseSymbolizePCOutput(buffer_, stack);
|
||||
return result;
|
||||
}
|
||||
|
@ -11,6 +11,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "llvm/DebugInfo/Symbolize/DIPrinter.h"
|
||||
@ -32,17 +33,25 @@ extern "C" {
|
||||
typedef uint64_t u64;
|
||||
|
||||
bool __sanitizer_symbolize_code(const char *ModuleName, uint64_t ModuleOffset,
|
||||
char *Buffer, int MaxLength) {
|
||||
char *Buffer, int MaxLength,
|
||||
bool SymbolizeInlineFrames) {
|
||||
std::string Result;
|
||||
{
|
||||
llvm::raw_string_ostream OS(Result);
|
||||
llvm::symbolize::DIPrinter Printer(OS);
|
||||
// TODO: it is neccessary to set proper SectionIndex here.
|
||||
// object::SectionedAddress::UndefSection works for only absolute addresses.
|
||||
auto ResOrErr = getDefaultSymbolizer()->symbolizeInlinedCode(
|
||||
ModuleName,
|
||||
{ModuleOffset, llvm::object::SectionedAddress::UndefSection});
|
||||
Printer << (ResOrErr ? ResOrErr.get() : llvm::DIInliningInfo());
|
||||
if (SymbolizeInlineFrames) {
|
||||
auto ResOrErr = getDefaultSymbolizer()->symbolizeInlinedCode(
|
||||
ModuleName,
|
||||
{ModuleOffset, llvm::object::SectionedAddress::UndefSection});
|
||||
Printer << (ResOrErr ? ResOrErr.get() : llvm::DIInliningInfo());
|
||||
} else {
|
||||
auto ResOrErr = getDefaultSymbolizer()->symbolizeCode(
|
||||
ModuleName,
|
||||
{ModuleOffset, llvm::object::SectionedAddress::UndefSection});
|
||||
Printer << (ResOrErr ? ResOrErr.get() : llvm::DILineInfo());
|
||||
}
|
||||
}
|
||||
return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
|
||||
Result.c_str()) < MaxLength;
|
||||
|
Loading…
Reference in New Issue
Block a user