forked from OSchip/llvm-project
[MSVC2015] Fix mangling for static variables initialization guards
It seems that suffix '@4HA' was omitted for unknown reason. It is non-cont non-volatile 'int' type of normal variable TSS. Differential revision: http://reviews.llvm.org/D20683 llvm-svn: 270974
This commit is contained in:
parent
c013e5737b
commit
5fa681ee78
|
@ -2837,6 +2837,7 @@ void MicrosoftMangleContextImpl::mangleThreadSafeStaticGuardVariable(
|
|||
|
||||
Mangler.getStream() << "\01?$TSS" << GuardNum << '@';
|
||||
Mangler.mangleNestedName(VD);
|
||||
Mangler.getStream() << "@4HA";
|
||||
}
|
||||
|
||||
void MicrosoftMangleContextImpl::mangleStaticGuardVariable(const VarDecl *VD,
|
||||
|
|
|
@ -9,12 +9,14 @@ struct S {
|
|||
// CHECK-DAG: @"\01?s@?1??f@@YAAAUS@@XZ@4U2@A" = linkonce_odr thread_local global %struct.S zeroinitializer
|
||||
// CHECK-DAG: @"\01??__J?1??f@@YAAAUS@@XZ@51" = linkonce_odr thread_local global i32 0
|
||||
// CHECK-DAG: @"\01?s@?1??g@@YAAAUS@@XZ@4U2@A" = linkonce_odr global %struct.S zeroinitializer
|
||||
// CHECK-DAG: @"\01?$TSS0@?1??g@@YAAAUS@@XZ" = linkonce_odr global i32 0
|
||||
// CHECK-DAG: @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA" = linkonce_odr global i32 0
|
||||
// CHECK-DAG: @_Init_thread_epoch = external thread_local global i32, align 4
|
||||
// CHECK-DAG: @"\01?j@?1??h@@YAAAUS@@_N@Z@4U2@A" = linkonce_odr thread_local global %struct.S zeroinitializer
|
||||
// CHECK-DAG: @"\01??__J?1??h@@YAAAUS@@_N@Z@51" = linkonce_odr thread_local global i32 0
|
||||
// CHECK-DAG: @"\01?i@?1??h@@YAAAUS@@_N@Z@4U2@A" = linkonce_odr global %struct.S zeroinitializer
|
||||
// CHECK-DAG: @"\01?$TSS0@?1??h@@YAAAUS@@_N@Z" = linkonce_odr global i32 0
|
||||
// CHECK-DAG: @"\01?$TSS0@?1??h@@YAAAUS@@_N@Z@4HA" = linkonce_odr global i32 0
|
||||
// CHECK-DAG: @"\01?i@?1??g1@@YAHXZ@4HA" = internal global i32 0, align 4
|
||||
// CHECK-DAG: @"\01?$TSS0@?1??g1@@YAHXZ@4HA" = internal global i32 0, align 4
|
||||
|
||||
// CHECK-LABEL: define {{.*}} @"\01?f@@YAAAUS@@XZ"()
|
||||
// CHECK-SAME: personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*)
|
||||
|
@ -51,14 +53,14 @@ extern inline S &f() {
|
|||
// CHECK-LABEL: define {{.*}} @"\01?g@@YAAAUS@@XZ"()
|
||||
extern inline S &g() {
|
||||
static S s;
|
||||
// CHECK: %[[guard:.*]] = load atomic i32, i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ" unordered, align 4
|
||||
// CHECK: %[[guard:.*]] = load atomic i32, i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA" unordered, align 4
|
||||
// CHECK-NEXT: %[[epoch:.*]] = load i32, i32* @_Init_thread_epoch
|
||||
// CHECK-NEXT: %[[cmp:.*]] = icmp sgt i32 %[[guard]], %[[epoch]]
|
||||
// CHECK-NEXT: br i1 %[[cmp]], label %[[init_attempt:.*]], label %[[init_end:.*]]
|
||||
//
|
||||
// CHECK: [[init_attempt]]:
|
||||
// CHECK-NEXT: call void @_Init_thread_header(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ")
|
||||
// CHECK-NEXT: %[[guard2:.*]] = load atomic i32, i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ" unordered, align 4
|
||||
// CHECK-NEXT: call void @_Init_thread_header(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA")
|
||||
// CHECK-NEXT: %[[guard2:.*]] = load atomic i32, i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA" unordered, align 4
|
||||
// CHECK-NEXT: %[[cmp2:.*]] = icmp eq i32 %[[guard2]], -1
|
||||
// CHECK-NEXT: br i1 %[[cmp2]], label %[[init:.*]], label %[[init_end:.*]]
|
||||
//
|
||||
|
@ -68,7 +70,7 @@ extern inline S &g() {
|
|||
//
|
||||
// CHECK: [[invoke_cont]]:
|
||||
// CHECK-NEXT: call i32 @atexit(void ()* @"\01??__Fs@?1??g@@YAAAUS@@XZ@YAXXZ")
|
||||
// CHECK-NEXT: call void @_Init_thread_footer(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ")
|
||||
// CHECK-NEXT: call void @_Init_thread_footer(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA")
|
||||
// CHECK-NEXT: br label %init.end
|
||||
//
|
||||
// CHECK: [[init_end]]:
|
||||
|
@ -76,7 +78,7 @@ extern inline S &g() {
|
|||
//
|
||||
// CHECK: [[lpad]]:
|
||||
// CHECK-NEXT: cleanuppad within none []
|
||||
// CHECK: call void @_Init_thread_abort(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ")
|
||||
// CHECK: call void @_Init_thread_abort(i32* @"\01?$TSS0@?1??g@@YAAAUS@@XZ@4HA")
|
||||
// CHECK-NEXT: cleanupret {{.*}} unwind to caller
|
||||
return s;
|
||||
}
|
||||
|
@ -86,3 +88,10 @@ extern inline S&h(bool b) {
|
|||
static S i;
|
||||
return b ? j : i;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define i32 @"\01?g1@@YAHXZ"()
|
||||
int f1();
|
||||
int g1() {
|
||||
static int i = f1();
|
||||
return i;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue