Things can't both be in comdats and have common linkage, so never give things in comdats common linkage. Common linkage is only used in .c files, and the only thing that can trigger a comdat in c is selectany from what I can tell. Fixes PR23243. Also address an over-the-shoulder review comment from rnk by moving the hasAttr<SelectAnyAttr>() in Decl.cpp around a bit. It only makes a minor difference for selectany on global variables, so it goes well with the rest of this patch. http://reviews.llvm.org/D9042 llvm-svn: 235053
40 lines
1.2 KiB
C
40 lines
1.2 KiB
C
// RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s
|
|
|
|
__declspec(selectany) int x1 = 1;
|
|
const __declspec(selectany) int x2 = 2;
|
|
// CHECK: @x1 = weak_odr global i32 1, comdat, align 4
|
|
// CHECK: @x2 = weak_odr constant i32 2, comdat, align 4
|
|
|
|
// selectany turns extern variable declarations into definitions.
|
|
__declspec(selectany) int x3;
|
|
extern __declspec(selectany) int x4;
|
|
// CHECK: @x3 = weak_odr global i32 0, comdat, align 4
|
|
// CHECK: @x4 = weak_odr global i32 0, comdat, align 4
|
|
|
|
struct __declspec(align(16)) S {
|
|
char x;
|
|
};
|
|
union { struct S s; } u;
|
|
|
|
// CHECK: @u = {{.*}}zeroinitializer, align 16
|
|
|
|
|
|
// CHECK: define void @t3() [[NAKED:#[0-9]+]] {
|
|
__declspec(naked) void t3() {}
|
|
|
|
// CHECK: define void @t22() [[NUW:#[0-9]+]]
|
|
void __declspec(nothrow) t22();
|
|
void t22() {}
|
|
|
|
// CHECK: define void @t2() [[NI:#[0-9]+]] {
|
|
__declspec(noinline) void t2() {}
|
|
|
|
// CHECK: call void @f20_t() [[NR:#[0-9]+]]
|
|
__declspec(noreturn) void f20_t(void);
|
|
void f20(void) { f20_t(); }
|
|
|
|
// CHECK: attributes [[NAKED]] = { naked noinline nounwind{{.*}} }
|
|
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
|
// CHECK: attributes [[NI]] = { noinline nounwind{{.*}} }
|
|
// CHECK: attributes [[NR]] = { noreturn }
|