llvm-6502/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll
Alexey Samsonov b2d259060d [ASan] Collect unmangled names of global variables in Clang to print them in error reports.
Currently ASan instrumentation pass creates a string with global name
for each instrumented global (to include global names in the error report). Global
name is already mangled at this point, and we may not be able to demangle it
at runtime (e.g. there is no __cxa_demangle on Android).

Instead, create a string with fully qualified global name in Clang, and pass it
to ASan instrumentation pass in llvm.asan.globals metadata. If there is no metadata
for some global, ASan will use the original algorithm.

This fixes https://code.google.com/p/address-sanitizer/issues/detail?id=264.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212872 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-12 00:42:52 +00:00

82 lines
2.6 KiB
LLVM

; RUN: opt < %s -asan -asan-module -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@xxx = internal global i32 0, align 4 ; With dynamic initializer.
@XXX = global i32 0, align 4 ; With dynamic initializer.
@yyy = internal global i32 0, align 4 ; W/o dynamic initializer.
@YYY = global i32 0, align 4 ; W/o dynamic initializer.
; Clang will emit the following metadata identifying @xxx as dynamically
; initialized.
!0 = metadata !{i32* @xxx, null, null, i1 true, i1 false}
!1 = metadata !{i32* @XXX, null, null, i1 true, i1 false}
!2 = metadata !{i32* @yyy, null, null, i1 false, i1 false}
!3 = metadata !{i32* @YYY, null, null, i1 false, i1 false}
!llvm.asan.globals = !{!0, !1, !2, !3}
define i32 @initializer() uwtable {
entry:
ret i32 42
}
define internal void @__cxx_global_var_init() section ".text.startup" {
entry:
%call = call i32 @initializer()
store i32 %call, i32* @xxx, align 4
ret void
}
@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
define internal void @_GLOBAL__I_a() sanitize_address section ".text.startup" {
entry:
call void @__cxx_global_var_init()
ret void
}
; Clang indicated that @xxx was dynamically initailized.
; __asan_{before,after}_dynamic_init should be called from _GLOBAL__I_a
; CHECK: define internal void @_GLOBAL__I_a
; CHECK-NOT: ret
; CHECK: call void @__asan_before_dynamic_init
; CHECK: call void @__cxx_global_var_init
; CHECK: call void @__asan_after_dynamic_init
; CHECK: ret
; Check that xxx is instrumented.
define void @touch_xxx() sanitize_address {
store i32 0, i32 *@xxx, align 4
ret void
; CHECK: define void @touch_xxx
; CHECK: call void @__asan_report_store4
; CHECK: ret void
}
; Check that XXX is instrumented.
define void @touch_XXX() sanitize_address {
store i32 0, i32 *@XXX, align 4
ret void
; CHECK: define void @touch_XXX
; CHECK: call void @__asan_report_store4
; CHECK: ret void
}
; Check that yyy is NOT instrumented (as it does not have dynamic initializer).
define void @touch_yyy() sanitize_address {
store i32 0, i32 *@yyy, align 4
ret void
; CHECK: define void @touch_yyy
; CHECK-NOT: call void @__asan_report_store4
; CHECK: ret void
}
; Check that YYY is NOT instrumented (as it does not have dynamic initializer).
define void @touch_YYY() sanitize_address {
store i32 0, i32 *@YYY, align 4
ret void
; CHECK: define void @touch_YYY
; CHECK-NOT: call void @__asan_report_store4
; CHECK: ret void
}