summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/asan/asan_debugging.cc
diff options
context:
space:
mode:
authorFilipe Cabecinhas <me@filcab.net>2016-09-09 20:43:20 +0000
committerFilipe Cabecinhas <me@filcab.net>2016-09-09 20:43:20 +0000
commit4aff9e6d716172b800903c913b0917bec55fb4c5 (patch)
tree3ae9486fc0b94cca423cc9bab9f6695bf0a6c729 /compiler-rt/lib/asan/asan_debugging.cc
parent5057f17716f0622e3237af141627fb0eeba76fa1 (diff)
downloadbcm5719-llvm-4aff9e6d716172b800903c913b0917bec55fb4c5.tar.gz
bcm5719-llvm-4aff9e6d716172b800903c913b0917bec55fb4c5.zip
[asan] Add a new AddressDescription structure, which can describe any type of address.
Summary: This is useful for inclusion in the Error* structures, to describe an arbitrary address. Remove the old struct since it's used only once. This removes one level of indirection, and moves all *AddressDescription to be one of the recently introduced structures. This merges differential revisions: D24131 and D24132 Reviewers: kcc, eugenis, vitalybuka Subscribers: kubabrecka, llvm-commits Differential Revision: https://reviews.llvm.org/D24131 llvm-svn: 281090
Diffstat (limited to 'compiler-rt/lib/asan/asan_debugging.cc')
-rw-r--r--compiler-rt/lib/asan/asan_debugging.cc114
1 files changed, 55 insertions, 59 deletions
diff --git a/compiler-rt/lib/asan/asan_debugging.cc b/compiler-rt/lib/asan/asan_debugging.cc
index 053eb51fffa..37c5922dc0f 100644
--- a/compiler-rt/lib/asan/asan_debugging.cc
+++ b/compiler-rt/lib/asan/asan_debugging.cc
@@ -24,8 +24,9 @@
namespace {
using namespace __asan;
-void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset,
- AddressDescription *descr) {
+static void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset,
+ char *name, uptr name_size,
+ uptr &region_address, uptr &region_size) {
InternalMmapVector<StackVarDescr> vars(16);
if (!ParseFrameDescription(frame_descr, &vars)) {
return;
@@ -36,62 +37,15 @@ void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset,
// We use name_len + 1 because strlcpy will guarantee a \0 at the end, so
// if we're limiting the copy due to name_len, we add 1 to ensure we copy
// the whole name and then terminate with '\0'.
- internal_strlcpy(descr->name, vars[i].name_pos,
- Min(descr->name_size, vars[i].name_len + 1));
- descr->region_address = addr - (offset - vars[i].beg);
- descr->region_size = vars[i].size;
+ internal_strlcpy(name, vars[i].name_pos,
+ Min(name_size, vars[i].name_len + 1));
+ region_address = addr - (offset - vars[i].beg);
+ region_size = vars[i].size;
return;
}
}
}
-void AsanLocateAddress(uptr addr, AddressDescription *descr) {
- ShadowAddressDescription shadow_descr;
- if (GetShadowAddressInformation(addr, &shadow_descr)) {
- descr->region_kind = ShadowNames[shadow_descr.kind];
- return;
- }
- GlobalAddressDescription global_descr;
- if (GetGlobalAddressInformation(addr, &global_descr)) {
- descr->region_kind = "global";
- auto &g = global_descr.globals[0];
- internal_strlcpy(descr->name, g.name, descr->name_size);
- descr->region_address = g.beg;
- descr->region_size = g.size;
- return;
- }
-
- StackAddressDescription stack_descr;
- asanThreadRegistry().Lock();
- if (GetStackAddressInformation(addr, &stack_descr)) {
- asanThreadRegistry().Unlock();
- descr->region_kind = "stack";
- if (!stack_descr.frame_descr) {
- descr->name[0] = 0;
- descr->region_address = 0;
- descr->region_size = 0;
- } else {
- FindInfoForStackVar(addr, stack_descr.frame_descr, stack_descr.offset,
- descr);
- }
- return;
- }
- asanThreadRegistry().Unlock();
-
- descr->name[0] = 0;
- HeapAddressDescription heap_descr;
- if (GetHeapAddressInformation(addr, 1, &heap_descr)) {
- descr->region_address = heap_descr.chunk_access.chunk_begin;
- descr->region_size = heap_descr.chunk_access.chunk_size;
- descr->region_kind = "heap";
- return;
- }
-
- descr->region_address = 0;
- descr->region_size = 0;
- descr->region_kind = "heap-invalid";
-}
-
uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
bool alloc_stack) {
AsanChunkView chunk = FindHeapChunkByAddress(addr);
@@ -123,12 +77,54 @@ uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
SANITIZER_INTERFACE_ATTRIBUTE
const char *__asan_locate_address(uptr addr, char *name, uptr name_size,
- uptr *region_address, uptr *region_size) {
- AddressDescription descr = { name, name_size, 0, 0, nullptr };
- AsanLocateAddress(addr, &descr);
- if (region_address) *region_address = descr.region_address;
- if (region_size) *region_size = descr.region_size;
- return descr.region_kind;
+ uptr *region_address_ptr,
+ uptr *region_size_ptr) {
+ AddressDescription descr(addr);
+ uptr region_address = 0;
+ uptr region_size = 0;
+ const char *region_kind = nullptr;
+ if (name && name_size > 0) name[0] = 0;
+
+ if (auto shadow = descr.AsShadow()) {
+ // region_{address,size} are already 0
+ switch (shadow->kind) {
+ case kShadowKindLow:
+ region_kind = "low shadow";
+ break;
+ case kShadowKindGap:
+ region_kind = "shadow gap";
+ break;
+ case kShadowKindHigh:
+ region_kind = "high shadow";
+ break;
+ }
+ } else if (auto heap = descr.AsHeap()) {
+ region_kind = "heap";
+ region_address = heap->chunk_access.chunk_begin;
+ region_size = heap->chunk_access.chunk_size;
+ } else if (auto stack = descr.AsStack()) {
+ region_kind = "stack";
+ if (!stack->frame_descr) {
+ // region_{address,size} are already 0
+ } else {
+ FindInfoForStackVar(addr, stack->frame_descr, stack->offset, name,
+ name_size, region_address, region_size);
+ }
+ } else if (auto global = descr.AsGlobal()) {
+ region_kind = "global";
+ auto &g = global->globals[0];
+ internal_strlcpy(name, g.name, name_size);
+ region_address = g.beg;
+ region_size = g.size;
+ } else {
+ // region_{address,size} are already 0
+ region_kind = "heap-invalid";
+ }
+
+ CHECK(region_kind);
+ if (region_address_ptr) *region_address_ptr = region_address;
+ if (region_size_ptr) *region_size_ptr = region_size;
+ return region_kind;
}
SANITIZER_INTERFACE_ATTRIBUTE
OpenPOWER on IntegriCloud