forked from OSchip/llvm-project
[SEH] Switch from frameaddress(0) to localaddress
This should do the right thing for stack realignment prologues. llvm-svn: 241644
This commit is contained in:
parent
d5afc62ff6
commit
15d152d3ac
|
@ -1310,9 +1310,8 @@ struct PerformSEHFinally : EHScopeStack::Cleanup {
|
|||
|
||||
// Compute the two argument values.
|
||||
QualType ArgTys[2] = {Context.UnsignedCharTy, Context.VoidPtrTy};
|
||||
llvm::Value *FrameAddr = CGM.getIntrinsic(llvm::Intrinsic::frameaddress);
|
||||
llvm::Value *FP =
|
||||
CGF.Builder.CreateCall(FrameAddr, {CGF.Builder.getInt32(0)});
|
||||
llvm::Value *LocalAddrFn = CGM.getIntrinsic(llvm::Intrinsic::localaddress);
|
||||
llvm::Value *FP = CGF.Builder.CreateCall(LocalAddrFn, {});
|
||||
llvm::Value *IsForEH =
|
||||
llvm::ConstantInt::get(CGF.ConvertType(ArgTys[0]), F.isForEHCleanup());
|
||||
Args.add(RValue::get(IsForEH), ArgTys[0]);
|
||||
|
|
|
@ -19,14 +19,14 @@ void basic_finally(void) {
|
|||
// CHECK: to label %[[invoke_cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
|
||||
//
|
||||
// CHECK: [[invoke_cont]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 0, i8* %[[fp]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
// CHECK: [[lpad]]
|
||||
// CHECK-NEXT: landingpad
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
|
||||
// CHECK: resume { i8*, i32 }
|
||||
|
||||
|
@ -59,7 +59,7 @@ l:
|
|||
// CHECK: to label %[[invoke_cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
|
||||
//
|
||||
// CHECK: [[invoke_cont]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@label_in_finally@@"({{i8( zeroext)?}} 0, i8* %[[fp]])
|
||||
// CHECK: ret void
|
||||
|
||||
|
@ -86,14 +86,14 @@ void use_abnormal_termination(void) {
|
|||
// CHECK: to label %[[invoke_cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
|
||||
//
|
||||
// CHECK: [[invoke_cont]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} 0, i8* %[[fp]])
|
||||
// CHECK: ret void
|
||||
//
|
||||
// CHECK: [[lpad]]
|
||||
// CHECK-NEXT: landingpad
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
|
||||
// CHECK: resume { i8*, i32 }
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ int __leave_with___finally_simple() {
|
|||
// CHECK-NEXT: br label %[[tryleave:[^ ]*]]
|
||||
// CHECK-NOT: store i32 23
|
||||
// CHECK: [[tryleave]]
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@__leave_with___finally_simple@@"(i8 0, i8* %[[fp]])
|
||||
|
||||
// __finally block doesn't return, __finally.cont doesn't exist.
|
||||
|
@ -94,7 +94,7 @@ int __leave_with___finally_noreturn() {
|
|||
// CHECK-NEXT: br label %[[tryleave:[^ ]*]]
|
||||
// CHECK-NOT: store i32 23
|
||||
// CHECK: [[tryleave]]
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@__leave_with___finally_noreturn@@"(i8 0, i8* %[[fp]])
|
||||
|
||||
// The "normal" case.
|
||||
|
@ -118,7 +118,7 @@ int __leave_with___finally() {
|
|||
// CHECK-NEXT: br label %[[tryleave:[^ ]*]]
|
||||
// CHECK-NOT: store i32 23
|
||||
// CHECK: [[tryleave]]
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@__leave_with___finally@@"(i8 0, i8* %[[fp]])
|
||||
|
||||
|
||||
|
@ -148,7 +148,7 @@ int nested___except___finally() {
|
|||
// CHECK-NEXT: to label %[[g1_cont1:.*]] unwind label %[[g1_lpad:.*]]
|
||||
|
||||
// CHECK: [[g1_cont1]]
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: invoke void @"\01?fin$0@0@nested___except___finally@@"(i8 0, i8* %[[fp]])
|
||||
// CHECK-NEXT: to label %[[fin_cont:.*]] unwind label %[[g2_lpad:.*]]
|
||||
|
||||
|
@ -159,7 +159,7 @@ int nested___except___finally() {
|
|||
// CHECK: [[g1_lpad]]
|
||||
// CHECK-NEXT: landingpad
|
||||
// CHECK-NEXT: catch i8* null
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: invoke void @"\01?fin$0@0@nested___except___finally@@"(i8 1, i8* %[[fp]])
|
||||
// CHECK-NEXT: to label %[[g1_resume:.*]] unwind label %[[g2_lpad]]
|
||||
|
||||
|
@ -266,7 +266,7 @@ int nested___finally___except() {
|
|||
// CHECK-NOT: 23
|
||||
|
||||
// CHECK: [[g2_lpad]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___except@@"(i8 1, i8* %[[fp]])
|
||||
// CHECK-NEXT: br label %[[ehresume:[^ ]*]]
|
||||
|
||||
|
@ -275,7 +275,7 @@ int nested___finally___except() {
|
|||
// CHECK-NEXT: br label %[[tryleave]]
|
||||
|
||||
// CHECK: [[tryleave]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___except@@"(i8 0, i8* %[[fp]])
|
||||
// CHECK-NEXT: ret i32 1
|
||||
|
||||
|
@ -311,20 +311,20 @@ int nested___finally___finally() {
|
|||
|
||||
// CHECK: [[g1_cont]]
|
||||
// CHECK: store i32 16, i32* %[[myres:[^ ]*]],
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: invoke void @"\01?fin$1@0@nested___finally___finally@@"(i8 0, i8* %[[fp]])
|
||||
// CHECK-NEXT: to label %[[finally_cont:.*]] unwind label %[[g2_lpad:.*]]
|
||||
|
||||
// CHECK: [[finally_cont]]
|
||||
// CHECK: store i32 51, i32* %[[myres]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___finally@@"(i8 0, i8* %[[fp]])
|
||||
// CHECK-NEXT: ret i32 1
|
||||
|
||||
// CHECK: [[g1_lpad]]
|
||||
// CHECK-NEXT: landingpad
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: invoke void @"\01?fin$1@0@nested___finally___finally@@"(i8 1, i8* %[[fp]])
|
||||
// CHECK-NEXT: to label %[[finally_cont2:.*]] unwind label %[[g2_lpad]]
|
||||
|
||||
|
@ -337,7 +337,7 @@ int nested___finally___finally() {
|
|||
// CHECK: br label %[[ehcleanup]]
|
||||
|
||||
// CHECK: [[ehcleanup]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___finally@@"(i8 1, i8* %[[fp]])
|
||||
// CHECK: resume
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ int basic_finally(int g) {
|
|||
// CHECK: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
|
||||
//
|
||||
// CHECK: [[cont]]
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 0, i8* %[[fp]])
|
||||
// CHECK: load i32, i32* %[[g_addr]], align 4
|
||||
// CHECK: ret i32
|
||||
|
@ -196,7 +196,7 @@ int basic_finally(int g) {
|
|||
// CHECK: [[lpad]]
|
||||
// CHECK: landingpad { i8*, i32 }
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
|
||||
// CHECK: resume
|
||||
|
||||
|
|
|
@ -127,13 +127,13 @@ void use_inline() {
|
|||
//
|
||||
// CHECK: invoke void @might_throw()
|
||||
//
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@use_seh_in_inline_func@@"(i8 0, i8* %[[fp]])
|
||||
// CHECK: ret void
|
||||
//
|
||||
// CHECK: landingpad { i8*, i32 }
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
|
||||
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
|
||||
// CHECK: call void @"\01?fin$0@0@use_seh_in_inline_func@@"(i8 1, i8* %[[fp]])
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"\01?filt$0@0@use_seh_in_inline_func@@"(i8* %exception_pointers, i8* %frame_pointer) #{{[0-9]+}} comdat($use_seh_in_inline_func)
|
||||
|
|
Loading…
Reference in New Issue