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(MDN->getOperand(0)); + auto *GV = + mdconst::dyn_extract_or_null(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 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" + +@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}