mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
[asan] Set alignment of __asan_global_* globals to sizeof(GlobalStruct)
When using profiling and ASan together (-fprofile-instr-generate -fcoverage-mapping -fsanitize=address), at least on Darwin, the section of globals that ASan emits (__asan_globals) is misaligned and starts at an odd offset. This really doesn't have anything to do with profiling, but it triggers the issue because profiling emits a string section, which can have arbitrary size. This patch changes the alignment to sizeof(GlobalStruct). Differential Revision: https://reviews.llvm.org/D28573 llvm-svn: 291715
This commit is contained in:
parent
635a70fbaf
commit
9d8ba8e855
@ -1598,8 +1598,7 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M) {
|
||||
StructType::get(IntptrTy, IntptrTy, IntptrTy, IntptrTy, IntptrTy,
|
||||
IntptrTy, IntptrTy, IntptrTy, nullptr);
|
||||
unsigned SizeOfGlobalStruct = DL.getTypeAllocSize(GlobalStructTy);
|
||||
assert((isPowerOf2_32(SizeOfGlobalStruct) ||
|
||||
!TargetTriple.isOSBinFormatCOFF()) &&
|
||||
assert(isPowerOf2_32(SizeOfGlobalStruct) &&
|
||||
"global metadata will not be padded appropriately");
|
||||
SmallVector<Constant *, 16> Initializers(UseMetadataArray ? n : 0);
|
||||
|
||||
@ -1766,13 +1765,11 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M) {
|
||||
GlobalValue::getRealLinkageName(G->getName()));
|
||||
Metadata->setSection(getGlobalMetadataSection());
|
||||
|
||||
// We don't want any padding, but we also need a reasonable alignment.
|
||||
// The MSVC linker always inserts padding when linking incrementally. We
|
||||
// cope with that by aligning each struct to its size, which must be a power
|
||||
// of two.
|
||||
if (TargetTriple.isOSBinFormatCOFF())
|
||||
Metadata->setAlignment(SizeOfGlobalStruct);
|
||||
else
|
||||
Metadata->setAlignment(1); // Don't leave padding in between.
|
||||
Metadata->setAlignment(SizeOfGlobalStruct);
|
||||
|
||||
// On platforms that support comdats, put the metadata and the
|
||||
// instrumented global in the same group. This ensures that the metadata
|
||||
|
@ -16,7 +16,7 @@ target triple = "x86_64-apple-macosx10.11.0"
|
||||
|
||||
|
||||
; Find the metadata for @global:
|
||||
; CHECK: [[METADATA:@.+]] = internal global {{.*}} @global {{.*}} section "__DATA,__asan_globals,regular", align 1
|
||||
; CHECK: [[METADATA:@.+]] = internal global {{.*}} @global {{.*}} section "__DATA,__asan_globals,regular", align 64
|
||||
|
||||
; Find the liveness binder for @global and its metadata:
|
||||
; CHECK: @__asan_binder_global = internal global {{.*}} @global {{.*}} [[METADATA]] {{.*}} section "__DATA,__asan_liveness,regular,live_support"
|
||||
|
Loading…
Reference in New Issue
Block a user