mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
See https://code.google.com/p/address-sanitizer/issues/detail?id=299 for the original feature request. Introduce llvm.asan.globals metadata, which Clang (or any other frontend) may use to report extra information about global variables to ASan instrumentation pass in the backend. This metadata replaces llvm.asan.dynamically_initialized_globals that was used to detect init-order bugs. llvm.asan.globals contains the following data for each global: 1) source location (file/line/column info); 2) whether it is dynamically initialized; 3) whether it is blacklisted (shouldn't be instrumented). Source location data is then emitted in the binary and can be picked up by ASan runtime in case it needs to print error report involving some global. For example: 0x... is located 4 bytes to the right of global variable 'C::array' defined in '/path/to/file:17:8' (0x...) of size 40 These source locations are printed even if the binary doesn't have any debug info. This is an ABI-breaking change. ASan initialization is renamed to __asan_init_v4(). Pre-built libraries compiled with older Clang will not work with the fresh runtime. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212188 91177308-0d34-0410-b5e6-96231b3b80d8
83 lines
2.7 KiB
LLVM
83 lines
2.7 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 = global i32 0, align 4
|
|
|
|
; If a global is present, __asan_[un]register_globals should be called from
|
|
; module ctor/dtor
|
|
|
|
; CHECK: llvm.global_ctors
|
|
; CHECK: @__asan_gen_ = private constant [8 x i8] c"<stdin>\00", align 1
|
|
; CHECK: llvm.global_dtors
|
|
|
|
; Test that we don't instrument global arrays with static initializer
|
|
; indexed with constants in-bounds. But instrument all other cases.
|
|
|
|
@GlobSt = global [10 x i32] zeroinitializer, align 16 ; static initializer
|
|
@GlobDy = global [10 x i32] zeroinitializer, align 16 ; dynamic initializer
|
|
@GlobEx = external global [10 x i32] , align 16 ; extern initializer
|
|
|
|
; GlobSt is declared here, and has static initializer -- ok to optimize.
|
|
define i32 @AccessGlobSt_0_2() sanitize_address {
|
|
entry:
|
|
%0 = load i32* getelementptr inbounds ([10 x i32]* @GlobSt, i64 0, i64 2), align 8
|
|
ret i32 %0
|
|
; CHECK-LABEL: define i32 @AccessGlobSt_0_2
|
|
; CHECK-NOT: __asan_report
|
|
; CHECK: ret i32 %0
|
|
}
|
|
|
|
; GlobSt is accessed out of bounds -- can't optimize
|
|
define i32 @AccessGlobSt_0_12() sanitize_address {
|
|
entry:
|
|
%0 = load i32* getelementptr inbounds ([10 x i32]* @GlobSt, i64 0, i64 12), align 8
|
|
ret i32 %0
|
|
; CHECK-LABEL: define i32 @AccessGlobSt_0_12
|
|
; CHECK: __asan_report
|
|
; CHECK: ret i32
|
|
}
|
|
|
|
; GlobSt is accessed with Gep that has non-0 first index -- can't optimize.
|
|
define i32 @AccessGlobSt_1_2() sanitize_address {
|
|
entry:
|
|
%0 = load i32* getelementptr inbounds ([10 x i32]* @GlobSt, i64 1, i64 2), align 8
|
|
ret i32 %0
|
|
; CHECK-LABEL: define i32 @AccessGlobSt_1_2
|
|
; CHECK: __asan_report
|
|
; CHECK: ret i32
|
|
}
|
|
|
|
; GlobDy is declared with dynamic initializer -- can't optimize.
|
|
define i32 @AccessGlobDy_0_2() sanitize_address {
|
|
entry:
|
|
%0 = load i32* getelementptr inbounds ([10 x i32]* @GlobDy, i64 0, i64 2), align 8
|
|
ret i32 %0
|
|
; CHECK-LABEL: define i32 @AccessGlobDy_0_2
|
|
; CHECK: __asan_report
|
|
; CHECK: ret i32
|
|
}
|
|
|
|
; GlobEx is an external global -- can't optimize.
|
|
define i32 @AccessGlobEx_0_2() sanitize_address {
|
|
entry:
|
|
%0 = load i32* getelementptr inbounds ([10 x i32]* @GlobEx, i64 0, i64 2), align 8
|
|
ret i32 %0
|
|
; CHECK-LABEL: define i32 @AccessGlobEx_0_2
|
|
; CHECK: __asan_report
|
|
; CHECK: ret i32
|
|
}
|
|
|
|
|
|
!llvm.asan.globals = !{!0}
|
|
!0 = metadata !{[10 x i32]* @GlobDy, null, i1 true, i1 false}
|
|
|
|
; CHECK-LABEL: define internal void @asan.module_ctor
|
|
; CHECK-NOT: ret
|
|
; CHECK: call void @__asan_register_globals
|
|
; CHECK: ret
|
|
|
|
; CHECK-LABEL: define internal void @asan.module_dtor
|
|
; CHECK-NOT: ret
|
|
; CHECK: call void @__asan_unregister_globals
|
|
; CHECK: ret
|