[PATCH] D55794: [asan] In llvm.asan.globals, allow entries to be non-GlobalVariable and skip over them

Kuba (Brecka) Mracek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 17 14:50:27 PST 2018


kubamracek created this revision.
kubamracek added reviewers: rjmccall, aprantl, yln, delcypher, kcc, eugenis, vitalybuka.
kubamracek added a project: Sanitizers.

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 skip over them in the llvm.asan.globals list.


Repository:
  rL LLVM

https://reviews.llvm.org/D55794

Files:
  lib/Transforms/Instrumentation/AddressSanitizer.cpp
  test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll


Index: test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll
===================================================================
--- test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll
+++ test/Instrumentation/AddressSanitizer/global_metadata_bitcasts.ll
@@ -0,0 +1,12 @@
+; 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"
+
+ at global = global i32 0, align 4
+!0 = !{i32* @global, null, null, i1 true, i1 false}
+!1 = !{i8* bitcast (i32* @global to i8*), null, null, i1 false, i1 true}
+!llvm.asan.globals = !{!0, !1}
Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -441,7 +441,8 @@
     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<GlobalVariable>(MDN->getOperand(0));
+      auto *GV =
+          mdconst::dyn_extract_or_null<GlobalVariable>(MDN->getOperand(0));
       // The optimizer may optimize away a global entirely.
       if (!GV) continue;
       // We can already have an entry for GV if it was merged with another


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55794.178538.patch
Type: text/x-patch
Size: 1553 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181217/c8f71412/attachment.bin>


More information about the llvm-commits mailing list