Skip to content

Commit 499382f

Browse files
committed
[CodeGen][AArch64][FMV] PAC the stub_helper's frame on arm64e
1 parent bee2654 commit 499382f

22 files changed

+280
-123
lines changed

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2833,7 +2833,11 @@ static void CreateMultiVersionResolverReturn(CodeGenModule &CGM,
28332833
llvm::Function *FuncToReturn,
28342834
bool SupportsIFunc) {
28352835
if (SupportsIFunc) {
2836-
Builder.CreateRet(FuncToReturn);
2836+
llvm::Constant *Fn = FuncToReturn;
2837+
const ASTContext &Ctx = CGM.getContext();
2838+
QualType FTy = Ctx.getFunctionType(Ctx.VoidTy, {}, FunctionProtoType::ExtProtoInfo());
2839+
Fn = CGM.getFunctionPointer(Fn, FTy);
2840+
Builder.CreateRet(Fn);
28372841
return;
28382842
}
28392843

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4510,13 +4510,16 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
45104510
// For cpu_specific, don't create an ifunc yet because we don't know if the
45114511
// cpu_dispatch will be emitted in this translation unit.
45124512
if (getTarget().supportsIFunc() && !FD->isCPUSpecificMultiVersion()) {
4513-
llvm::Type *ResolverType = llvm::FunctionType::get(
4513+
llvm::FunctionType *ResolverType = llvm::FunctionType::get(
45144514
llvm::PointerType::get(DeclTy,
45154515
getTypes().getTargetAddressSpace(FD->getType())),
45164516
false);
4517-
llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4518-
MangledName + ".resolver", ResolverType, GlobalDecl{},
4519-
/*ForVTable=*/false);
4517+
llvm::Function *Resolver = cast<llvm::Function>(
4518+
CreateRuntimeFunction(ResolverType, MangledName + ".resolver")
4519+
.getCallee());
4520+
llvm::AttrBuilder Attrs(getLLVMContext());
4521+
addDefaultFunctionDefinitionAttributes(Attrs);
4522+
Resolver->addFnAttrs(Attrs);
45204523
llvm::GlobalIFunc *GIF =
45214524
llvm::GlobalIFunc::create(DeclTy, 0, getMultiversionLinkage(*this, GD),
45224525
"", Resolver, &getModule());
@@ -4527,8 +4530,11 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
45274530
return GIF;
45284531
}
45294532

4530-
llvm::Constant *Resolver = GetOrCreateLLVMFunction(
4531-
ResolverName, DeclTy, GlobalDecl{}, /*ForVTable=*/false);
4533+
llvm::Function *Resolver = cast<llvm::Function>(
4534+
CreateRuntimeFunction(DeclTy, ResolverName).getCallee());
4535+
llvm::AttrBuilder Attrs(getLLVMContext());
4536+
addDefaultFunctionDefinitionAttributes(Attrs);
4537+
Resolver->addFnAttrs(Attrs);
45324538
assert(isa<llvm::GlobalValue>(Resolver) &&
45334539
"Resolver should be created for the first time");
45344540
SetCommonAttributes(FD, cast<llvm::GlobalValue>(Resolver));

clang/test/CodeGen/aarch64-mixed-target-attributes.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
6262
// CHECK-NEXT: ret i32 2
6363
//
6464
//
65-
// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver() comdat {
65+
// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver
66+
// CHECK-SAME: () #[[ATTR4:[0-9]+]] comdat {
6667
// CHECK-NEXT: resolver_entry:
6768
// CHECK-NEXT: call void @__init_cpu_features_resolver()
6869
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
@@ -102,7 +103,7 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
102103
//
103104
// CHECK: Function Attrs: noinline nounwind optnone
104105
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mrdm
105-
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
106+
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
106107
// CHECK-NEXT: entry:
107108
// CHECK-NEXT: ret i32 3
108109
//
@@ -136,7 +137,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
136137
// CHECK-NEXT: ret i32 2
137138
//
138139
//
139-
// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver() comdat {
140+
// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver
141+
// CHECK-SAME: () #[[ATTR4]] comdat {
140142
// CHECK-NEXT: resolver_entry:
141143
// CHECK-NEXT: call void @__init_cpu_features_resolver()
142144
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
@@ -176,7 +178,7 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
176178
//
177179
// CHECK: Function Attrs: noinline nounwind optnone
178180
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mrdm
179-
// CHECK-SAME: () #[[ATTR4]] {
181+
// CHECK-SAME: () #[[ATTR5]] {
180182
// CHECK-NEXT: entry:
181183
// CHECK-NEXT: ret i32 3
182184
//
@@ -203,7 +205,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
203205
// CHECK-NEXT: ret i32 2
204206
//
205207
//
206-
// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver() comdat {
208+
// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver
209+
// CHECK-SAME: () #[[ATTR4]] comdat {
207210
// CHECK-NEXT: resolver_entry:
208211
// CHECK-NEXT: call void @__init_cpu_features_resolver()
209212
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
@@ -259,9 +262,9 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
259262
// CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+jsconv,+neon,-v9.5a" }
260263
// CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+dotprod,+fp-armv8,+neon,-v9.5a" }
261264
// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+lse,-v9.5a" }
262-
// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+neon,+rdm,-v9.5a" }
263-
// CHECK: attributes #[[ATTR5:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+dotprod,+fp-armv8,+neon,-v9.5a" }
264-
// CHECK: attributes #[[ATTR6:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="-v9.5a" }
265+
// CHECK: attributes #[[ATTR4]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="-v9.5a" }
266+
// CHECK: attributes #[[ATTR5]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+neon,+rdm,-v9.5a" }
267+
// CHECK: attributes #[[ATTR6:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+dotprod,+fp-armv8,+neon,-v9.5a" }
265268
// CHECK: attributes #[[ATTR7:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+lse,-v9.5a" }
266269
// CHECK: attributes #[[ATTR8:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+jsconv,+neon,-v9.5a" }
267270
//.

clang/test/CodeGen/attr-cpuspecific.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void SingleVersion(void);
5151
// LINUX: call void @llvm.trap
5252
// LINUX: unreachable
5353

54-
// WINDOWS: define weak_odr dso_local void @SingleVersion() comdat
54+
// WINDOWS: define weak_odr dso_local void @SingleVersion() {{.*}} comdat
5555
// WINDOWS: call void @__cpu_indicator_init()
5656
// WINDOWS: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4
5757
// WINDOWS: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 525311
@@ -82,7 +82,7 @@ void TwoVersions(void);
8282
// LINUX: call void @llvm.trap
8383
// LINUX: unreachable
8484

85-
// WINDOWS: define weak_odr dso_local void @TwoVersions() comdat
85+
// WINDOWS: define weak_odr dso_local void @TwoVersions() {{.*}} comdat
8686
// WINDOWS: call void @__cpu_indicator_init()
8787
// WINDOWS: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4
8888
// WINDOWS: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 9422847
@@ -125,7 +125,7 @@ void OrderDispatchUsageSpecific(void);
125125
// LINUX: call void @llvm.trap
126126
// LINUX: unreachable
127127

128-
// WINDOWS: define weak_odr dso_local void @OrderDispatchUsageSpecific() comdat
128+
// WINDOWS: define weak_odr dso_local void @OrderDispatchUsageSpecific() {{.*}} comdat
129129
// WINDOWS: call void @__cpu_indicator_init()
130130
// WINDOWS: call void @OrderDispatchUsageSpecific.Z()
131131
// WINDOWS-NEXT: ret void
@@ -174,7 +174,7 @@ void TwoVersionsSameAttr(void);
174174
// LINUX: call void @llvm.trap
175175
// LINUX: unreachable
176176

177-
// WINDOWS: define weak_odr dso_local void @TwoVersionsSameAttr() comdat
177+
// WINDOWS: define weak_odr dso_local void @TwoVersionsSameAttr() {{.*}} comdat
178178
// WINDOWS: call void @TwoVersionsSameAttr.Z
179179
// WINDOWS-NEXT: ret void
180180
// WINDOWS: call void @TwoVersionsSameAttr.S
@@ -194,7 +194,7 @@ void ThreeVersionsSameAttr(void){}
194194
// LINUX: call void @llvm.trap
195195
// LINUX: unreachable
196196

197-
// WINDOWS: define weak_odr dso_local void @ThreeVersionsSameAttr() comdat
197+
// WINDOWS: define weak_odr dso_local void @ThreeVersionsSameAttr() {{.*}} comdat
198198
// WINDOWS: call void @__cpu_indicator_init
199199
// WINDOWS: call void @ThreeVersionsSameAttr.Z
200200
// WINDOWS-NEXT: ret void
@@ -210,7 +210,7 @@ void OrderSpecificUsageDispatch(void);
210210
// LINUX: define weak_odr ptr @OrderSpecificUsageDispatch.resolver()
211211
// LINUX: ret ptr @OrderSpecificUsageDispatch.Z
212212

213-
// WINDOWS: define weak_odr dso_local void @OrderSpecificUsageDispatch() comdat
213+
// WINDOWS: define weak_odr dso_local void @OrderSpecificUsageDispatch() {{.*}} comdat
214214
// WINDOWS: call void @__cpu_indicator_init
215215
// WINDOWS: call void @OrderSpecificUsageDispatch.Z
216216
// WINDOWS-NEXT: ret void
@@ -226,7 +226,7 @@ void NoSpecifics(void);
226226
// LINUX: call void @llvm.trap
227227
// LINUX: unreachable
228228

229-
// WINDOWS: define weak_odr dso_local void @NoSpecifics() comdat
229+
// WINDOWS: define weak_odr dso_local void @NoSpecifics() {{.*}} comdat
230230
// WINDOWS: call void @__cpu_indicator_init
231231
// WINDOWS: call void @NoSpecifics.Z
232232
// WINDOWS-NEXT: ret void
@@ -247,7 +247,7 @@ void HasGeneric(void);
247247
// LINUX: ret ptr @HasGeneric.A
248248
// LINUX-NOT: call void @llvm.trap
249249

250-
// WINDOWS: define weak_odr dso_local void @HasGeneric() comdat
250+
// WINDOWS: define weak_odr dso_local void @HasGeneric() {{.*}} comdat
251251
// WINDOWS: call void @__cpu_indicator_init
252252
// WINDOWS: call void @HasGeneric.Z
253253
// WINDOWS-NEXT: ret void
@@ -269,7 +269,7 @@ void HasParams(int i, double d);
269269
// LINUX: ret ptr @HasParams.A
270270
// LINUX-NOT: call void @llvm.trap
271271

272-
// WINDOWS: define weak_odr dso_local void @HasParams(i32 %0, double %1) comdat
272+
// WINDOWS: define weak_odr dso_local void @HasParams(i32 %0, double %1) {{.*}} comdat
273273
// WINDOWS: call void @__cpu_indicator_init
274274
// WINDOWS: call void @HasParams.Z(i32 %0, double %1)
275275
// WINDOWS-NEXT: ret void
@@ -291,7 +291,7 @@ int HasParamsAndReturn(int i, double d);
291291
// LINUX: ret ptr @HasParamsAndReturn.A
292292
// LINUX-NOT: call void @llvm.trap
293293

294-
// WINDOWS: define weak_odr dso_local i32 @HasParamsAndReturn(i32 %0, double %1) comdat
294+
// WINDOWS: define weak_odr dso_local i32 @HasParamsAndReturn(i32 %0, double %1) {{.*}} comdat
295295
// WINDOWS: call void @__cpu_indicator_init
296296
// WINDOWS: %[[RET:.+]] = musttail call i32 @HasParamsAndReturn.Z(i32 %0, double %1)
297297
// WINDOWS-NEXT: ret i32 %[[RET]]
@@ -312,7 +312,7 @@ int GenericAndPentium(int i, double d);
312312
// LINUX-NOT: ret ptr @GenericAndPentium.A
313313
// LINUX-NOT: call void @llvm.trap
314314

315-
// WINDOWS: define weak_odr dso_local i32 @GenericAndPentium(i32 %0, double %1) comdat
315+
// WINDOWS: define weak_odr dso_local i32 @GenericAndPentium(i32 %0, double %1) {{.*}} comdat
316316
// WINDOWS: call void @__cpu_indicator_init
317317
// WINDOWS: %[[RET:.+]] = musttail call i32 @GenericAndPentium.O(i32 %0, double %1)
318318
// WINDOWS-NEXT: ret i32 %[[RET]]
@@ -327,7 +327,7 @@ int DispatchFirst(void);
327327
// LINUX: ret ptr @DispatchFirst.O
328328
// LINUX: ret ptr @DispatchFirst.B
329329

330-
// WINDOWS: define weak_odr dso_local i32 @DispatchFirst() comdat
330+
// WINDOWS: define weak_odr dso_local i32 @DispatchFirst() {{.*}} comdat
331331
// WINDOWS: %[[RET:.+]] = musttail call i32 @DispatchFirst.O()
332332
// WINDOWS-NEXT: ret i32 %[[RET]]
333333
// WINDOWS: %[[RET:.+]] = musttail call i32 @DispatchFirst.B()

clang/test/CodeGen/attr-target-clones.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,45 +44,45 @@
4444
static int __attribute__((target_clones("sse4.2, default"))) internal(void) { return 0; }
4545
int use(void) { return internal(); }
4646
/// Internal linkage resolvers do not use comdat.
47-
// LINUX: define internal ptr @internal.resolver() {
48-
// DARWIN: define internal ptr @internal.resolver() {
49-
// WINDOWS: define internal i32 @internal() {
47+
// LINUX: define internal ptr @internal.resolver()
48+
// DARWIN: define internal ptr @internal.resolver()
49+
// WINDOWS: define internal i32 @internal()
5050

5151
int __attribute__((target_clones("sse4.2, default"))) foo(void) { return 0; }
5252
// LINUX: define {{.*}}i32 @foo.sse4.2.0()
5353
// LINUX: define {{.*}}i32 @foo.default.1()
54-
// LINUX: define weak_odr ptr @foo.resolver() comdat
54+
// LINUX: define weak_odr ptr @foo.resolver() {{.*}} comdat
5555
// LINUX: ret ptr @foo.sse4.2.0
5656
// LINUX: ret ptr @foo.default.1
5757

5858
// DARWIN: define {{.*}}i32 @foo.sse4.2.0()
5959
// DARWIN: define {{.*}}i32 @foo.default.1()
60-
// DARWIN: define weak_odr ptr @foo.resolver() {
60+
// DARWIN: define weak_odr ptr @foo.resolver()
6161
// DARWIN: ret ptr @foo.sse4.2.0
6262
// DARWIN: ret ptr @foo.default.1
6363

6464
// WINDOWS: define dso_local i32 @foo.sse4.2.0()
6565
// WINDOWS: define dso_local i32 @foo.default.1()
66-
// WINDOWS: define weak_odr dso_local i32 @foo() comdat
66+
// WINDOWS: define weak_odr dso_local i32 @foo() {{.*}} comdat
6767
// WINDOWS: musttail call i32 @foo.sse4.2.0
6868
// WINDOWS: musttail call i32 @foo.default.1
6969

7070
__attribute__((target_clones("default,default ,sse4.2"))) void foo_dupes(void) {}
7171
// LINUX: define {{.*}}void @foo_dupes.default.1()
7272
// LINUX: define {{.*}}void @foo_dupes.sse4.2.0()
73-
// LINUX: define weak_odr ptr @foo_dupes.resolver() comdat
73+
// LINUX: define weak_odr ptr @foo_dupes.resolver() {{.*}} comdat
7474
// LINUX: ret ptr @foo_dupes.sse4.2.0
7575
// LINUX: ret ptr @foo_dupes.default.1
7676

7777
// DARWIN: define {{.*}}void @foo_dupes.default.1()
7878
// DARWIN: define {{.*}}void @foo_dupes.sse4.2.0()
79-
// DARWIN: define weak_odr ptr @foo_dupes.resolver() {
79+
// DARWIN: define weak_odr ptr @foo_dupes.resolver()
8080
// DARWIN: ret ptr @foo_dupes.sse4.2.0
8181
// DARWIN: ret ptr @foo_dupes.default.1
8282

8383
// WINDOWS: define dso_local void @foo_dupes.default.1()
8484
// WINDOWS: define dso_local void @foo_dupes.sse4.2.0()
85-
// WINDOWS: define weak_odr dso_local void @foo_dupes() comdat
85+
// WINDOWS: define weak_odr dso_local void @foo_dupes() {{.*}} comdat
8686
// WINDOWS: musttail call void @foo_dupes.sse4.2.0
8787
// WINDOWS: musttail call void @foo_dupes.default.1
8888

@@ -109,19 +109,19 @@ int bar(void) {
109109
void __attribute__((target_clones("default, arch=ivybridge"))) unused(void) {}
110110
// LINUX: define {{.*}}void @unused.default.1()
111111
// LINUX: define {{.*}}void @unused.arch_ivybridge.0()
112-
// LINUX: define weak_odr ptr @unused.resolver() comdat
112+
// LINUX: define weak_odr ptr @unused.resolver() {{.*}} comdat
113113
// LINUX: ret ptr @unused.arch_ivybridge.0
114114
// LINUX: ret ptr @unused.default.1
115115

116116
// DARWIN: define {{.*}}void @unused.default.1()
117117
// DARWIN: define {{.*}}void @unused.arch_ivybridge.0()
118-
// DARWIN: define weak_odr ptr @unused.resolver() {
118+
// DARWIN: define weak_odr ptr @unused.resolver()
119119
// DARWIN: ret ptr @unused.arch_ivybridge.0
120120
// DARWIN: ret ptr @unused.default.1
121121

122122
// WINDOWS: define dso_local void @unused.default.1()
123123
// WINDOWS: define dso_local void @unused.arch_ivybridge.0()
124-
// WINDOWS: define weak_odr dso_local void @unused() comdat
124+
// WINDOWS: define weak_odr dso_local void @unused() {{.*}} comdat
125125
// WINDOWS: musttail call void @unused.arch_ivybridge.0
126126
// WINDOWS: musttail call void @unused.default.1
127127

@@ -144,34 +144,34 @@ int bar3(void) {
144144
// WINDOWS: call i32 @foo_inline2()
145145
}
146146

147-
// LINUX: define weak_odr ptr @foo_inline.resolver() comdat
147+
// LINUX: define weak_odr ptr @foo_inline.resolver() {{.*}} comdat
148148
// LINUX: ret ptr @foo_inline.arch_sandybridge.0
149149
// LINUX: ret ptr @foo_inline.sse4.2.1
150150
// LINUX: ret ptr @foo_inline.default.2
151151

152-
// DARWIN: define weak_odr ptr @foo_inline.resolver() {
152+
// DARWIN: define weak_odr ptr @foo_inline.resolver()
153153
// DARWIN: ret ptr @foo_inline.arch_sandybridge.0
154154
// DARWIN: ret ptr @foo_inline.sse4.2.1
155155
// DARWIN: ret ptr @foo_inline.default.2
156156

157-
// WINDOWS: define weak_odr dso_local i32 @foo_inline() comdat
157+
// WINDOWS: define weak_odr dso_local i32 @foo_inline() {{.*}} comdat
158158
// WINDOWS: musttail call i32 @foo_inline.arch_sandybridge.0
159159
// WINDOWS: musttail call i32 @foo_inline.sse4.2.1
160160
// WINDOWS: musttail call i32 @foo_inline.default.2
161161

162162
inline int __attribute__((target_clones("arch=sandybridge,default,sse4.2")))
163163
foo_inline2(void){ return 0; }
164-
// LINUX: define weak_odr ptr @foo_inline2.resolver() comdat
164+
// LINUX: define weak_odr ptr @foo_inline2.resolver() {{.*}} comdat
165165
// LINUX: ret ptr @foo_inline2.arch_sandybridge.0
166166
// LINUX: ret ptr @foo_inline2.sse4.2.1
167167
// LINUX: ret ptr @foo_inline2.default.2
168168

169-
// DARWIN: define weak_odr ptr @foo_inline2.resolver() {
169+
// DARWIN: define weak_odr ptr @foo_inline2.resolver()
170170
// DARWIN: ret ptr @foo_inline2.arch_sandybridge.0
171171
// DARWIN: ret ptr @foo_inline2.sse4.2.1
172172
// DARWIN: ret ptr @foo_inline2.default.2
173173

174-
// WINDOWS: define weak_odr dso_local i32 @foo_inline2() comdat
174+
// WINDOWS: define weak_odr dso_local i32 @foo_inline2() {{.*}} comdat
175175
// WINDOWS: musttail call i32 @foo_inline2.arch_sandybridge.0
176176
// WINDOWS: musttail call i32 @foo_inline2.sse4.2.1
177177
// WINDOWS: musttail call i32 @foo_inline2.default.2
@@ -194,15 +194,15 @@ int test_foo_used_no_defn(void) {
194194
}
195195

196196

197-
// LINUX: define weak_odr ptr @foo_used_no_defn.resolver() comdat
197+
// LINUX: define weak_odr ptr @foo_used_no_defn.resolver() {{.*}} comdat
198198
// LINUX: ret ptr @foo_used_no_defn.sse4.2.0
199199
// LINUX: ret ptr @foo_used_no_defn.default.1
200200

201-
// DARWIN: define weak_odr ptr @foo_used_no_defn.resolver() {
201+
// DARWIN: define weak_odr ptr @foo_used_no_defn.resolver()
202202
// DARWIN: ret ptr @foo_used_no_defn.sse4.2.0
203203
// DARWIN: ret ptr @foo_used_no_defn.default.1
204204

205-
// WINDOWS: define weak_odr dso_local i32 @foo_used_no_defn() comdat
205+
// WINDOWS: define weak_odr dso_local i32 @foo_used_no_defn() {{.*}} comdat
206206
// WINDOWS: musttail call i32 @foo_used_no_defn.sse4.2.0
207207
// WINDOWS: musttail call i32 @foo_used_no_defn.default.1
208208

@@ -213,7 +213,7 @@ int isa_level(int) { return 0; }
213213
// LINUX: define{{.*}} i32 @isa_level.arch_x86-64-v2.1(
214214
// LINUX: define{{.*}} i32 @isa_level.arch_x86-64-v3.2(
215215
// LINUX: define{{.*}} i32 @isa_level.arch_x86-64-v4.3(
216-
// LINUX: define weak_odr ptr @isa_level.resolver() comdat
216+
// LINUX: define weak_odr ptr @isa_level.resolver() {{.*}} comdat
217217
// LINUX: call void @__cpu_indicator_init()
218218
// LINUX-NEXT: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 2)
219219
// LINUX-NEXT: and i32 %[[#]], 4
@@ -234,7 +234,7 @@ int isa_level(int) { return 0; }
234234
// DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v2.1(
235235
// DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v3.2(
236236
// DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v4.3(
237-
// DARWIN: define weak_odr ptr @isa_level.resolver() {
237+
// DARWIN: define weak_odr ptr @isa_level.resolver()
238238
// DARWIN: call void @__cpu_indicator_init()
239239
// DARWIN-NEXT: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 2)
240240
// DARWIN-NEXT: and i32 %[[#]], 4

clang/test/CodeGen/attr-target-mv-va-args.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ int bar(void) {
2424
// IFUNC-ELF: call i32 (i32, ...) @foo.ifunc(i32 noundef 1, i32 noundef 97, double
2525
// IFUNC-ELF: call i32 (i32, ...) @foo.ifunc(i32 noundef 2, double noundef 2.2{{[0-9Ee+]+}}, ptr noundef
2626

27-
// IFUNC-ELF: define weak_odr ptr @foo.resolver() comdat
27+
// IFUNC-ELF: define weak_odr ptr @foo.resolver() {{.*}} comdat
2828
// IFUNC-ELF: ret ptr @foo.arch_sandybridge
2929
// IFUNC-ELF: ret ptr @foo.arch_ivybridge
3030
// IFUNC-ELF: ret ptr @foo.sse4.2
@@ -59,8 +59,8 @@ int bar(void) {
5959
// NO-IFUNC: call i32 (i32, ...) @foo.resolver(i32 noundef 1, i32 noundef 97, double
6060
// NO-IFUNC: call i32 (i32, ...) @foo.resolver(i32 noundef 2, double noundef 2.2{{[0-9Ee+]+}}, ptr noundef
6161

62-
// WINDOWS: define weak_odr dso_local i32 @foo.resolver(i32 %0, ...) comdat
63-
// NO-IFUNC-ELF: define weak_odr i32 @foo.resolver(i32 %0, ...) comdat
62+
// WINDOWS: define weak_odr dso_local i32 @foo.resolver(i32 %0, ...) {{.*}} comdat
63+
// NO-IFUNC-ELF: define weak_odr i32 @foo.resolver(i32 %0, ...) {{.*}} comdat
6464
// NO-IFUNC: musttail call i32 (i32, ...) @foo.arch_sandybridge
6565
// NO-IFUNC: musttail call i32 (i32, ...) @foo.arch_ivybridge
6666
// NO-IFUNC: musttail call i32 (i32, ...) @foo.sse4.2

0 commit comments

Comments
 (0)