forked from OSchip/llvm-project
Use the correct alignment for uuid descriptors
The _GUID_ descriptors emitted by MSVC have alignment 8 for 64-bit builds: we should do the same if the linker picks the "wrong" COMDAT. llvm-svn: 264530
This commit is contained in:
parent
1dbc7a7a5a
commit
6568760090
|
@ -1458,8 +1458,8 @@ ConstantAddress CodeGenModule::GetAddrOfUuidDescriptor(
|
||||||
std::string Name = "_GUID_" + Uuid.lower();
|
std::string Name = "_GUID_" + Uuid.lower();
|
||||||
std::replace(Name.begin(), Name.end(), '-', '_');
|
std::replace(Name.begin(), Name.end(), '-', '_');
|
||||||
|
|
||||||
// Contains a 32-bit field.
|
// The UUID descriptor should be pointer aligned.
|
||||||
CharUnits Alignment = CharUnits::fromQuantity(4);
|
CharUnits Alignment = CharUnits::fromQuantity(PointerAlignInBytes);
|
||||||
|
|
||||||
// Look for an existing global.
|
// Look for an existing global.
|
||||||
if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
|
if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// RUN: %clang_cc1 -emit-llvm %s -o - -DDEFINE_GUID -triple=i386-pc-linux -fms-extensions | FileCheck %s --check-prefix=CHECK-DEFINE-GUID
|
// RUN: %clang_cc1 -emit-llvm %s -o - -DDEFINE_GUID -triple=i386-pc-linux -fms-extensions | FileCheck %s --check-prefix=CHECK-DEFINE-GUID
|
||||||
// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-linux -fms-extensions | FileCheck %s
|
// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-linux -fms-extensions | FileCheck %s
|
||||||
|
// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-pc-linux -fms-extensions | FileCheck %s --check-prefix=CHECK-64
|
||||||
// RUN: %clang_cc1 -emit-llvm %s -o - -DDEFINE_GUID -DWRONG_GUID -triple=i386-pc-linux -fms-extensions | FileCheck %s --check-prefix=CHECK-DEFINE-WRONG-GUID
|
// RUN: %clang_cc1 -emit-llvm %s -o - -DDEFINE_GUID -DWRONG_GUID -triple=i386-pc-linux -fms-extensions | FileCheck %s --check-prefix=CHECK-DEFINE-WRONG-GUID
|
||||||
|
|
||||||
#ifdef DEFINE_GUID
|
#ifdef DEFINE_GUID
|
||||||
|
@ -36,6 +37,7 @@ GUID g = __uuidof(S1);
|
||||||
// First global use of __uuidof(S1) forces the creation of the global.
|
// First global use of __uuidof(S1) forces the creation of the global.
|
||||||
// CHECK: @_GUID_12345678_1234_1234_1234_1234567890ab = linkonce_odr constant { i32, i16, i16, [8 x i8] } { i32 305419896, i16 4660, i16 4660, [8 x i8] c"\124\124Vx\90\AB" }, comdat
|
// CHECK: @_GUID_12345678_1234_1234_1234_1234567890ab = linkonce_odr constant { i32, i16, i16, [8 x i8] } { i32 305419896, i16 4660, i16 4660, [8 x i8] c"\124\124Vx\90\AB" }, comdat
|
||||||
// CHECK: @gr = constant %struct._GUID* bitcast ({ i32, i16, i16, [8 x i8] }* @_GUID_12345678_1234_1234_1234_1234567890ab to %struct._GUID*), align 4
|
// CHECK: @gr = constant %struct._GUID* bitcast ({ i32, i16, i16, [8 x i8] }* @_GUID_12345678_1234_1234_1234_1234567890ab to %struct._GUID*), align 4
|
||||||
|
// CHECK-64: @gr = constant %struct._GUID* bitcast ({ i32, i16, i16, [8 x i8] }* @_GUID_12345678_1234_1234_1234_1234567890ab to %struct._GUID*), align 8
|
||||||
const GUID& gr = __uuidof(S1);
|
const GUID& gr = __uuidof(S1);
|
||||||
|
|
||||||
// CHECK: @gp = global %struct._GUID* bitcast ({ i32, i16, i16, [8 x i8] }* @_GUID_12345678_1234_1234_1234_1234567890ab to %struct._GUID*), align 4
|
// CHECK: @gp = global %struct._GUID* bitcast ({ i32, i16, i16, [8 x i8] }* @_GUID_12345678_1234_1234_1234_1234567890ab to %struct._GUID*), align 4
|
||||||
|
|
Loading…
Reference in New Issue