Stub files for common symbolizer for AddressSanitizer and ThreadSanitizer tools.
It is an analogue of addr2line utility and should allow to map instruction address to a location in source code at run-time. It should use debug information (in DWARF) in a binary, and hopefully it would be possible to re-use code from llvm/DebugInfo/DIContext.h llvm-svn: 157806
This commit is contained in:
parent
1d4d62d76c
commit
6f596767c3
|
@ -0,0 +1,56 @@
|
|||
//===-- symbolizer.cc -------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This is a stub for LLVM-based symbolizer.
|
||||
// This file is shared between AddressSanitizer and ThreadSanitizer
|
||||
// run-time libraries. See sanitizer.h for details.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// WARNING: Avoid using library functions - see comments in symbolizer.h.
|
||||
#include "sanitizer_symbolizer.h"
|
||||
// FIXME: replace library malloc/free with internal_malloc/internal_free
|
||||
// that would be provided by ASan/TSan run-time libraries.
|
||||
#if defined(__linux__)
|
||||
# include <malloc.h>
|
||||
#elif defined(__APPLE__)
|
||||
# include <malloc/malloc.h>
|
||||
#endif
|
||||
|
||||
namespace __sanitizer {
|
||||
|
||||
void AddressInfo::Clear() {
|
||||
free(module);
|
||||
free(function);
|
||||
free(file);
|
||||
}
|
||||
|
||||
void AddressInfoList::Clear() {
|
||||
AddressInfoList *cur = this;
|
||||
while (cur) {
|
||||
cur->info.Clear();
|
||||
AddressInfoList *nxt = cur->next;
|
||||
free(cur);
|
||||
cur = nxt;
|
||||
}
|
||||
}
|
||||
|
||||
AddressInfoList* SymbolizeCode(uptr address) {
|
||||
AddressInfoList *list = (AddressInfoList*)malloc(sizeof(AddressInfoList));
|
||||
list->next = 0;
|
||||
list->info.address = address;
|
||||
list->info.module = 0;
|
||||
list->info.module_offset = 0;
|
||||
list->info.function = 0;
|
||||
list->info.file = 0;
|
||||
list->info.line = 0;
|
||||
list->info.column = 0;
|
||||
return list;
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
|
@ -0,0 +1,60 @@
|
|||
//===-- symbolizer.h --------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Symbolizer is intended to be used by both
|
||||
// AddressSanitizer and ThreadSanitizer to symbolize a given
|
||||
// address. It is an analogue of addr2line utility and allows to map
|
||||
// instruction address to a location in source code at run-time.
|
||||
//
|
||||
// Symbolizer is planned to use debug information (in DWARF format)
|
||||
// in a binary via interface defined in "llvm/DebugInfo/DIContext.h"
|
||||
//
|
||||
// Symbolizer code should be called from the run-time library of
|
||||
// dynamic tools, and generally should not call memory allocation
|
||||
// routines or other system library functions intercepted by those tools.
|
||||
// Instead, Symbolizer code should use their replacements, defined in
|
||||
// "compiler-rt/lib/sanitizer_common/sanitizer_libc.h".
|
||||
//===----------------------------------------------------------------------===//
|
||||
#ifndef SANITIZER_SYMBOLIZER_H
|
||||
#define SANITIZER_SYMBOLIZER_H
|
||||
|
||||
#include "sanitizer_defs.h"
|
||||
#include "sanitizer_libc.h"
|
||||
// WARNING: Do not include system headers here. See details above.
|
||||
|
||||
namespace __sanitizer {
|
||||
|
||||
struct AddressInfo {
|
||||
uptr address;
|
||||
char *module;
|
||||
uptr module_offset;
|
||||
char *function;
|
||||
char *file;
|
||||
int line;
|
||||
int column;
|
||||
|
||||
// Deletes all strings.
|
||||
void Clear();
|
||||
};
|
||||
|
||||
struct AddressInfoList {
|
||||
AddressInfoList *next;
|
||||
AddressInfo info;
|
||||
|
||||
// Deletes all nodes in a list.
|
||||
void Clear();
|
||||
};
|
||||
|
||||
// Returns a list of descriptions for a given address (in all inlined
|
||||
// functions). The ownership is transferred to the caller.
|
||||
AddressInfoList* SymbolizeCode(uptr address);
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_SYMBOLIZER_H
|
Loading…
Reference in New Issue