mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 11:08:32 +00:00
[asan] Don't overalign global metadata.
Other than on COFF with incremental linking, global metadata should not need any extra alignment. Differential Revision: https://reviews.llvm.org/D28628 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291859 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dad67dd505
commit
e2cae83d96
@ -1609,22 +1609,12 @@ void AddressSanitizerModule::SetComdatForGlobalMetadata(
|
||||
GlobalVariable *
|
||||
AddressSanitizerModule::CreateMetadataGlobal(Module &M, Constant *Initializer,
|
||||
StringRef OriginalName) {
|
||||
auto &DL = M.getDataLayout();
|
||||
GlobalVariable *Metadata =
|
||||
new GlobalVariable(M, Initializer->getType(), false,
|
||||
GlobalVariable::InternalLinkage, Initializer,
|
||||
Twine("__asan_global_") +
|
||||
GlobalValue::getRealLinkageName(OriginalName));
|
||||
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.
|
||||
unsigned SizeOfGlobalStruct = DL.getTypeAllocSize(Initializer->getType());
|
||||
assert(isPowerOf2_32(SizeOfGlobalStruct) &&
|
||||
"global metadata will not be padded appropriately");
|
||||
Metadata->setAlignment(SizeOfGlobalStruct);
|
||||
return Metadata;
|
||||
}
|
||||
|
||||
@ -1642,11 +1632,22 @@ void AddressSanitizerModule::InstrumentGlobalsCOFF(
|
||||
IRBuilder<> &IRB, Module &M, ArrayRef<GlobalVariable *> ExtendedGlobals,
|
||||
ArrayRef<Constant *> MetadataInitializers) {
|
||||
assert(ExtendedGlobals.size() == MetadataInitializers.size());
|
||||
auto &DL = M.getDataLayout();
|
||||
|
||||
for (size_t i = 0; i < ExtendedGlobals.size(); i++) {
|
||||
Constant *Initializer = MetadataInitializers[i];
|
||||
GlobalVariable *G = ExtendedGlobals[i];
|
||||
GlobalVariable *Metadata =
|
||||
CreateMetadataGlobal(M, MetadataInitializers[i], G->getName());
|
||||
CreateMetadataGlobal(M, Initializer, G->getName());
|
||||
|
||||
// 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.
|
||||
unsigned SizeOfGlobalStruct = DL.getTypeAllocSize(Initializer->getType());
|
||||
assert(isPowerOf2_32(SizeOfGlobalStruct) &&
|
||||
"global metadata will not be padded appropriately");
|
||||
Metadata->setAlignment(SizeOfGlobalStruct);
|
||||
|
||||
SetComdatForGlobalMetadata(G, 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 64
|
||||
; CHECK: [[METADATA:@.+]] = internal global {{.*}} @global {{.*}} section "__DATA,__asan_globals,regular"
|
||||
|
||||
; 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…
x
Reference in New Issue
Block a user