From: Kuba Mracek Date: Tue, 18 Dec 2018 21:20:17 +0000 (+0000) Subject: [asan] In llvm.asan.globals, allow entries to be non-GlobalVariable and skip over... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=974ebed4b6a6457d107ff823aea74bca139afead;p=llvm [asan] In llvm.asan.globals, allow entries to be non-GlobalVariable and skip over them Looks like there are valid reasons why we need to allow bitcasts in llvm.asan.globals, see discussion at https://github.com/apple/swift-llvm/pull/133. Let's look through bitcasts when iterating over entries in the llvm.asan.globals list. Differential Revision: https://reviews.llvm.org/D55794 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349544 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index a5c64f354f4..769cd2343e0 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -441,8 +441,11 @@ public: for (auto MDN : Globals->operands()) { // Metadata node contains the global and the fields of "Entry". assert(MDN->getNumOperands() == 5); - auto *GV = mdconst::extract_or_null(MDN->getOperand(0)); + auto *V = mdconst::extract_or_null(MDN->getOperand(0)); // The optimizer may optimize away a global entirely. + if (!V) continue; + auto *StrippedV = V->stripPointerCasts(); + auto *GV = dyn_cast(StrippedV); if (!GV) continue; // We can already have an entry for GV if it was merged with another // global. diff --git a/test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll b/test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll new file mode 100644 index 00000000000..324a04e3b83 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll @@ -0,0 +1,13 @@ +; Test that the compiler doesn't crash when the llvm.asan.globals containts +; an entry that points to a BitCast instruction. + +; RUN: opt < %s -asan -asan-module -asan-globals-live-support=1 -S + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + +@g = global [1 x i32] zeroinitializer, align 4 + +!llvm.asan.globals = !{!0, !1} +!0 = !{[1 x i32]* @g, null, !"name", i1 false, i1 false} +!1 = !{i8* bitcast ([1 x i32]* @g to i8*), null, !"name", i1 false, i1 false}