Antonio Frighetto 970bf07d0b [clang][CodeGen] Ensure consistent mustprogress attribute emission
Emission of `mustprogress` attribute previously occurred only within
`EmitFunctionBody`, after generating the function body. Other routines
for function body creation may lack the attribute, potentially leading
to suboptimal optimizations later in the pipeline. Attribute emission
is now anticipated prior to generating the function body.

Fixes: https://github.com/llvm/llvm-project/issues/69833.
2023-11-11 09:43:03 +01:00

43 lines
1.5 KiB
C++

// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fno-use-cxa-atexit -fapple-kext -emit-llvm -o - %s | FileCheck %s
// CHECK: @_ZN5test01aE ={{.*}} global [[A:%.*]] zeroinitializer
// CHECK: @llvm.global_ctors = appending global {{.*}} { i32 65535, ptr [[CTOR0:@.*]], ptr null }
// CHECK: @llvm.global_dtors = appending global {{.*}} { i32 65535, ptr [[DTOR0:@.*]], ptr null }
// Check that the base destructor is marked as always_inline when generating
// code for kext.
namespace testBaseDestructor {
#pragma clang optimize off
struct D {
virtual ~D();
};
D::~D() {}
#pragma clang optimize on
}
// CHECK: define{{.*}} void @_ZN18testBaseDestructor1DD2Ev({{.*}}) unnamed_addr #[[ATTR0:.*]] align 2 {
// CHECK: define{{.*}} void @_ZN18testBaseDestructor1DD1Ev({{.*}}) unnamed_addr #[[ATTR1:.*]] align 2 {
// CHECK: define{{.*}} void @_ZN18testBaseDestructor1DD0Ev({{.*}}) unnamed_addr #[[ATTR1]] align 2 {
namespace test0 {
struct A { A(); ~A(); };
A a;
}
// CHECK: define internal void [[CTOR0_:@.*]]()
// CHECK: call void @_ZN5test01AC1Ev(ptr {{[^,]*}} @_ZN5test01aE)
// CHECK-NEXT: ret void
// CHECK: define internal void [[CTOR0]]()
// CHECK: call void [[CTOR0_]]()
// CHECK-NEXT: ret void
// CHECK: define internal void [[DTOR0]]()
// CHECK: call void @_ZN5test01AD1Ev(ptr @_ZN5test01aE)
// CHECK-NEXT: ret void
// CHECK: attributes #[[ATTR0]] = { alwaysinline mustprogress nounwind {{.*}} }
// CHECK: attributes #[[ATTR1]] = { mustprogress noinline nounwind {{.*}} }