
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.
43 lines
1.5 KiB
C++
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 {{.*}} }
|