Skip to content

Commit 201572e

Browse files
authored
[AArch64] Implement -fno-plt for SelectionDAG/GlobalISel
Clang sets the nonlazybind attribute for certain ObjC features. The AArch64 SelectionDAG implementation for non-intrinsic calls (46e36f0) is behind a cl option. GCC implements -fno-plt for a few ELF targets. In Clang, -fno-plt also sets the nonlazybind attribute. For SelectionDAG, make the cl option not affect ELF so that non-intrinsic calls to a dso_preemptable function use GOT. Adjust AArch64TargetLowering::LowerCall to handle intrinsic calls. For FastISel, change `fastLowerCall` to bail out when a call is due to -fno-plt. For GlobalISel, handle non-intrinsic calls in CallLowering::lowerCall and intrinsic calls in AArch64CallLowering::lowerCall (where the target-independent CallLowering::lowerCall is not called). The GlobalISel test in `call-rv-marker.ll` is therefore updated. Note: the current -fno-plt -fpic implementation does not use GOT for a preemptable function. Link: #78275 Pull Request: #78890
1 parent bf631c6 commit 201572e

9 files changed

+116
-68
lines changed

llvm/lib/CodeGen/GlobalISel/CallLowering.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,15 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
144144
// Try looking through a bitcast from one function type to another.
145145
// Commonly happens with calls to objc_msgSend().
146146
const Value *CalleeV = CB.getCalledOperand()->stripPointerCasts();
147-
if (const Function *F = dyn_cast<Function>(CalleeV))
148-
Info.Callee = MachineOperand::CreateGA(F, 0);
149-
else if (isa<GlobalIFunc>(CalleeV) || isa<GlobalAlias>(CalleeV)) {
147+
if (const Function *F = dyn_cast<Function>(CalleeV)) {
148+
if (F->hasFnAttribute(Attribute::NonLazyBind)) {
149+
LLT Ty = getLLTForType(*F->getType(), DL);
150+
Register Reg = MIRBuilder.buildGlobalValue(Ty, F).getReg(0);
151+
Info.Callee = MachineOperand::CreateReg(Reg, false);
152+
} else {
153+
Info.Callee = MachineOperand::CreateGA(F, 0);
154+
}
155+
} else if (isa<GlobalIFunc>(CalleeV) || isa<GlobalAlias>(CalleeV)) {
150156
// IR IFuncs and Aliases can't be forward declared (only defined), so the
151157
// callee must be in the same TU and therefore we can direct-call it without
152158
// worrying about it being out of range.

llvm/lib/Target/AArch64/AArch64FastISel.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -3172,6 +3172,11 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
31723172
if (CM == CodeModel::Large && !Subtarget->isTargetMachO())
31733173
return false;
31743174

3175+
// ELF -fno-plt compiled intrinsic calls do not have the nonlazybind
3176+
// attribute. Check "RtLibUseGOT" instead.
3177+
if (MF->getFunction().getParent()->getRtLibUseGOT())
3178+
return false;
3179+
31753180
// Let SDISel handle vararg functions.
31763181
if (IsVarArg)
31773182
return false;

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -8211,13 +8211,14 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
82118211
Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, OpFlags);
82128212
}
82138213
} else if (auto *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
8214-
if (getTargetMachine().getCodeModel() == CodeModel::Large &&
8215-
Subtarget->isTargetMachO()) {
8216-
const char *Sym = S->getSymbol();
8214+
bool UseGot = (getTargetMachine().getCodeModel() == CodeModel::Large &&
8215+
Subtarget->isTargetMachO()) ||
8216+
MF.getFunction().getParent()->getRtLibUseGOT();
8217+
const char *Sym = S->getSymbol();
8218+
if (UseGot) {
82178219
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, AArch64II::MO_GOT);
82188220
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, Callee);
82198221
} else {
8220-
const char *Sym = S->getSymbol();
82218222
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, 0);
82228223
}
82238224
}

llvm/lib/Target/AArch64/AArch64Subtarget.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ static cl::opt<bool>
4343
UseAddressTopByteIgnored("aarch64-use-tbi", cl::desc("Assume that top byte of "
4444
"an address is ignored"), cl::init(false), cl::Hidden);
4545

46-
static cl::opt<bool>
47-
UseNonLazyBind("aarch64-enable-nonlazybind",
48-
cl::desc("Call nonlazybind functions via direct GOT load"),
49-
cl::init(false), cl::Hidden);
46+
static cl::opt<bool> MachOUseNonLazyBind(
47+
"aarch64-macho-enable-nonlazybind",
48+
cl::desc("Call nonlazybind functions via direct GOT load for Mach-O"),
49+
cl::Hidden);
5050

5151
static cl::opt<bool> UseAA("aarch64-use-aa", cl::init(true),
5252
cl::desc("Enable the use of AA during codegen."));
@@ -433,7 +433,8 @@ unsigned AArch64Subtarget::classifyGlobalFunctionReference(
433433

434434
// NonLazyBind goes via GOT unless we know it's available locally.
435435
auto *F = dyn_cast<Function>(GV);
436-
if (UseNonLazyBind && F && F->hasFnAttribute(Attribute::NonLazyBind) &&
436+
if ((!isTargetMachO() || MachOUseNonLazyBind) && F &&
437+
F->hasFnAttribute(Attribute::NonLazyBind) &&
437438
!TM.shouldAssumeDSOLocal(*GV->getParent(), GV))
438439
return AArch64II::MO_GOT;
439440

llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -1301,8 +1301,17 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
13011301
!Subtarget.noBTIAtReturnTwice() &&
13021302
MF.getInfo<AArch64FunctionInfo>()->branchTargetEnforcement())
13031303
Opc = AArch64::BLR_BTI;
1304-
else
1304+
else {
1305+
// For an intrinsic call (e.g. memset), use GOT if "RtLibUseGOT" (-fno-plt)
1306+
// is set.
1307+
if (Info.Callee.isSymbol() && F.getParent()->getRtLibUseGOT()) {
1308+
auto MIB = MIRBuilder.buildInstr(TargetOpcode::G_GLOBAL_VALUE);
1309+
DstOp(getLLTForType(*F.getType(), DL)).addDefToMIB(MRI, MIB);
1310+
MIB.addExternalSymbol(Info.Callee.getSymbolName(), AArch64II::MO_GOT);
1311+
Info.Callee = MachineOperand::CreateReg(MIB.getReg(0), false);
1312+
}
13051313
Opc = getCallOpcode(MF, Info.Callee.isReg(), false);
1314+
}
13061315

13071316
auto MIB = MIRBuilder.buildInstrNoInsert(Opc);
13081317
unsigned CalleeOpNo = 0;

llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp

+12-4
Original file line numberDiff line numberDiff line change
@@ -2804,11 +2804,19 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
28042804
}
28052805

28062806
case TargetOpcode::G_GLOBAL_VALUE: {
2807-
auto GV = I.getOperand(1).getGlobal();
2808-
if (GV->isThreadLocal())
2809-
return selectTLSGlobalValue(I, MRI);
2807+
const GlobalValue *GV = nullptr;
2808+
unsigned OpFlags;
2809+
if (I.getOperand(1).isSymbol()) {
2810+
OpFlags = I.getOperand(1).getTargetFlags();
2811+
// Currently only used by "RtLibUseGOT".
2812+
assert(OpFlags == AArch64II::MO_GOT);
2813+
} else {
2814+
GV = I.getOperand(1).getGlobal();
2815+
if (GV->isThreadLocal())
2816+
return selectTLSGlobalValue(I, MRI);
2817+
OpFlags = STI.ClassifyGlobalReference(GV, TM);
2818+
}
28102819

2811-
unsigned OpFlags = STI.ClassifyGlobalReference(GV, TM);
28122820
if (OpFlags & AArch64II::MO_GOT) {
28132821
I.setDesc(TII.get(AArch64::LOADgot));
28142822
I.getOperand(1).setTargetFlags(OpFlags);

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,9 @@ bool AArch64LegalizerInfo::legalizeSmallCMGlobalValue(
13451345
// By splitting this here, we can optimize accesses in the small code model by
13461346
// folding in the G_ADD_LOW into the load/store offset.
13471347
auto &GlobalOp = MI.getOperand(1);
1348+
// Don't modify an intrinsic call.
1349+
if (GlobalOp.isSymbol())
1350+
return true;
13481351
const auto* GV = GlobalOp.getGlobal();
13491352
if (GV->isThreadLocal())
13501353
return true; // Don't want to modify TLS vars.

llvm/test/CodeGen/AArch64/call-rv-marker.ll

+28-8
Original file line numberDiff line numberDiff line change
@@ -201,17 +201,27 @@ define dso_local void @rv_marker_3() personality ptr @__gxx_personality_v0 {
201201
; GISEL-NEXT: bl _objc_object
202202
; GISEL-NEXT: Ltmp1:
203203
; GISEL-NEXT: ; %bb.1: ; %invoke.cont
204-
; GISEL-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
204+
; GISEL-NEXT: Lloh0:
205+
; GISEL-NEXT: adrp x1, _objc_release@GOTPAGE
205206
; GISEL-NEXT: mov x0, x19
207+
; GISEL-NEXT: Lloh1:
208+
; GISEL-NEXT: ldr x1, [x1, _objc_release@GOTPAGEOFF]
209+
; GISEL-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
206210
; GISEL-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
207-
; GISEL-NEXT: b _objc_release
211+
; GISEL-NEXT: br x1
208212
; GISEL-NEXT: LBB3_2: ; %lpad
209213
; GISEL-NEXT: Ltmp2:
214+
; GISEL-NEXT: Lloh2:
215+
; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
210216
; GISEL-NEXT: mov x20, x0
211217
; GISEL-NEXT: mov x0, x19
212-
; GISEL-NEXT: bl _objc_release
218+
; GISEL-NEXT: Lloh3:
219+
; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
220+
; GISEL-NEXT: blr x8
213221
; GISEL-NEXT: mov x0, x20
214222
; GISEL-NEXT: bl __Unwind_Resume
223+
; GISEL-NEXT: .loh AdrpLdrGot Lloh0, Lloh1
224+
; GISEL-NEXT: .loh AdrpLdrGot Lloh2, Lloh3
215225
; GISEL-NEXT: Lfunc_end0:
216226
; GISEL-NEXT: .cfi_endproc
217227
; GISEL-NEXT: .section __TEXT,__gcc_except_tab
@@ -352,8 +362,12 @@ define dso_local void @rv_marker_4() personality ptr @__gxx_personality_v0 {
352362
; GISEL-NEXT: bl _objc_object
353363
; GISEL-NEXT: Ltmp7:
354364
; GISEL-NEXT: ; %bb.2: ; %invoke.cont2
365+
; GISEL-NEXT: Lloh4:
366+
; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
355367
; GISEL-NEXT: mov x0, x19
356-
; GISEL-NEXT: bl _objc_release
368+
; GISEL-NEXT: Lloh5:
369+
; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
370+
; GISEL-NEXT: blr x8
357371
; GISEL-NEXT: add x0, sp, #15
358372
; GISEL-NEXT: bl __ZN1SD1Ev
359373
; GISEL-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
@@ -362,9 +376,13 @@ define dso_local void @rv_marker_4() personality ptr @__gxx_personality_v0 {
362376
; GISEL-NEXT: ret
363377
; GISEL-NEXT: LBB4_3: ; %lpad1
364378
; GISEL-NEXT: Ltmp8:
379+
; GISEL-NEXT: Lloh6:
380+
; GISEL-NEXT: adrp x8, _objc_release@GOTPAGE
365381
; GISEL-NEXT: mov x20, x0
366382
; GISEL-NEXT: mov x0, x19
367-
; GISEL-NEXT: bl _objc_release
383+
; GISEL-NEXT: Lloh7:
384+
; GISEL-NEXT: ldr x8, [x8, _objc_release@GOTPAGEOFF]
385+
; GISEL-NEXT: blr x8
368386
; GISEL-NEXT: b LBB4_5
369387
; GISEL-NEXT: LBB4_4: ; %lpad
370388
; GISEL-NEXT: Ltmp5:
@@ -374,6 +392,8 @@ define dso_local void @rv_marker_4() personality ptr @__gxx_personality_v0 {
374392
; GISEL-NEXT: bl __ZN1SD1Ev
375393
; GISEL-NEXT: mov x0, x20
376394
; GISEL-NEXT: bl __Unwind_Resume
395+
; GISEL-NEXT: .loh AdrpLdrGot Lloh4, Lloh5
396+
; GISEL-NEXT: .loh AdrpLdrGot Lloh6, Lloh7
377397
; GISEL-NEXT: Lfunc_end1:
378398
; GISEL-NEXT: .cfi_endproc
379399
; GISEL-NEXT: .section __TEXT,__gcc_except_tab
@@ -467,9 +487,9 @@ define dso_local ptr @rv_marker_5_indirect_call() {
467487
; GISEL-NEXT: .cfi_offset w29, -16
468488
; GISEL-NEXT: .cfi_offset w19, -24
469489
; GISEL-NEXT: .cfi_offset w20, -32
470-
; GISEL-NEXT: Lloh0:
490+
; GISEL-NEXT: Lloh8:
471491
; GISEL-NEXT: adrp x8, _fptr@PAGE
472-
; GISEL-NEXT: Lloh1:
492+
; GISEL-NEXT: Lloh9:
473493
; GISEL-NEXT: ldr x8, [x8, _fptr@PAGEOFF]
474494
; GISEL-NEXT: blr x8
475495
; GISEL-NEXT: mov x29, x29
@@ -480,7 +500,7 @@ define dso_local ptr @rv_marker_5_indirect_call() {
480500
; GISEL-NEXT: mov x0, x19
481501
; GISEL-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
482502
; GISEL-NEXT: ret
483-
; GISEL-NEXT: .loh AdrpLdr Lloh0, Lloh1
503+
; GISEL-NEXT: .loh AdrpLdr Lloh8, Lloh9
484504
entry:
485505
%0 = load ptr, ptr @fptr, align 8
486506
%call = call ptr %0() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
+38-43
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2-
; RUN: llc -mtriple=aarch64-apple-ios %s -o - -aarch64-enable-nonlazybind | FileCheck %s --check-prefix=MACHO
2+
; RUN: llc -mtriple=aarch64-apple-ios %s -o - -aarch64-macho-enable-nonlazybind | FileCheck %s --check-prefix=MACHO
33
; RUN: llc -mtriple=aarch64-apple-ios %s -o - | FileCheck %s --check-prefix=MACHO-NORMAL
44
; RUN: llc -mtriple=aarch64 -fast-isel %s -o - | FileCheck %s --check-prefixes=ELF,ELF-FI
55
; RUN: llc -mtriple=aarch64 -global-isel %s -o - | FileCheck %s --check-prefixes=ELF,ELF-GI
@@ -19,13 +19,18 @@ define void @test_laziness(ptr %a) nounwind {
1919
; MACHO-NEXT: Lloh1:
2020
; MACHO-NEXT: ldr x8, [x8, _external@GOTPAGEOFF]
2121
; MACHO-NEXT: blr x8
22+
; MACHO-NEXT: Lloh2:
23+
; MACHO-NEXT: adrp x8, _memset@GOTPAGE
2224
; MACHO-NEXT: mov x0, x19
2325
; MACHO-NEXT: mov w1, #1 ; =0x1
26+
; MACHO-NEXT: Lloh3:
27+
; MACHO-NEXT: ldr x8, [x8, _memset@GOTPAGEOFF]
2428
; MACHO-NEXT: mov w2, #1000 ; =0x3e8
25-
; MACHO-NEXT: bl _memset
29+
; MACHO-NEXT: blr x8
2630
; MACHO-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
2731
; MACHO-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
2832
; MACHO-NEXT: ret
33+
; MACHO-NEXT: .loh AdrpLdrGot Lloh2, Lloh3
2934
; MACHO-NEXT: .loh AdrpLdrGot Lloh0, Lloh1
3035
;
3136
; MACHO-NORMAL-LABEL: test_laziness:
@@ -34,50 +39,34 @@ define void @test_laziness(ptr %a) nounwind {
3439
; MACHO-NORMAL-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill
3540
; MACHO-NORMAL-NEXT: mov x19, x0
3641
; MACHO-NORMAL-NEXT: bl _external
42+
; MACHO-NORMAL-NEXT: Lloh0:
43+
; MACHO-NORMAL-NEXT: adrp x8, _memset@GOTPAGE
3744
; MACHO-NORMAL-NEXT: mov x0, x19
3845
; MACHO-NORMAL-NEXT: mov w1, #1 ; =0x1
46+
; MACHO-NORMAL-NEXT: Lloh1:
47+
; MACHO-NORMAL-NEXT: ldr x8, [x8, _memset@GOTPAGEOFF]
3948
; MACHO-NORMAL-NEXT: mov w2, #1000 ; =0x3e8
40-
; MACHO-NORMAL-NEXT: bl _memset
49+
; MACHO-NORMAL-NEXT: blr x8
4150
; MACHO-NORMAL-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
4251
; MACHO-NORMAL-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
4352
; MACHO-NORMAL-NEXT: ret
53+
; MACHO-NORMAL-NEXT: .loh AdrpLdrGot Lloh0, Lloh1
4454
;
45-
; ELF-FI-LABEL: test_laziness:
46-
; ELF-FI: // %bb.0:
47-
; ELF-FI-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
48-
; ELF-FI-NEXT: mov x19, x0
49-
; ELF-FI-NEXT: bl external
50-
; ELF-FI-NEXT: mov w8, #1 // =0x1
51-
; ELF-FI-NEXT: mov x0, x19
52-
; ELF-FI-NEXT: mov x2, #1000 // =0x3e8
53-
; ELF-FI-NEXT: uxtb w1, w8
54-
; ELF-FI-NEXT: bl memset
55-
; ELF-FI-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
56-
; ELF-FI-NEXT: ret
57-
;
58-
; ELF-GI-LABEL: test_laziness:
59-
; ELF-GI: // %bb.0:
60-
; ELF-GI-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
61-
; ELF-GI-NEXT: mov x19, x0
62-
; ELF-GI-NEXT: bl external
63-
; ELF-GI-NEXT: mov x0, x19
64-
; ELF-GI-NEXT: mov w1, #1 // =0x1
65-
; ELF-GI-NEXT: mov w2, #1000 // =0x3e8
66-
; ELF-GI-NEXT: bl memset
67-
; ELF-GI-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
68-
; ELF-GI-NEXT: ret
69-
;
70-
; ELF-SDAG-LABEL: test_laziness:
71-
; ELF-SDAG: // %bb.0:
72-
; ELF-SDAG-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
73-
; ELF-SDAG-NEXT: mov x19, x0
74-
; ELF-SDAG-NEXT: bl external
75-
; ELF-SDAG-NEXT: mov x0, x19
76-
; ELF-SDAG-NEXT: mov w1, #1 // =0x1
77-
; ELF-SDAG-NEXT: mov w2, #1000 // =0x3e8
78-
; ELF-SDAG-NEXT: bl memset
79-
; ELF-SDAG-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
80-
; ELF-SDAG-NEXT: ret
55+
; ELF-LABEL: test_laziness:
56+
; ELF: // %bb.0:
57+
; ELF-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
58+
; ELF-NEXT: adrp x8, :got:external
59+
; ELF-NEXT: mov x19, x0
60+
; ELF-NEXT: ldr x8, [x8, :got_lo12:external]
61+
; ELF-NEXT: blr x8
62+
; ELF-NEXT: adrp x8, :got:memset
63+
; ELF-NEXT: mov x0, x19
64+
; ELF-NEXT: mov w1, #1 // =0x1
65+
; ELF-NEXT: ldr x8, [x8, :got_lo12:memset]
66+
; ELF-NEXT: mov w2, #1000 // =0x3e8
67+
; ELF-NEXT: blr x8
68+
; ELF-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
69+
; ELF-NEXT: ret
8170
call void @external()
8271
call void @llvm.memset.p0.i64(ptr align 1 %a, i8 1, i64 1000, i1 false)
8372
ret void
@@ -86,20 +75,22 @@ define void @test_laziness(ptr %a) nounwind {
8675
define void @test_laziness_tail() nounwind {
8776
; MACHO-LABEL: test_laziness_tail:
8877
; MACHO: ; %bb.0:
89-
; MACHO-NEXT: Lloh2:
78+
; MACHO-NEXT: Lloh4:
9079
; MACHO-NEXT: adrp x0, _external@GOTPAGE
91-
; MACHO-NEXT: Lloh3:
80+
; MACHO-NEXT: Lloh5:
9281
; MACHO-NEXT: ldr x0, [x0, _external@GOTPAGEOFF]
9382
; MACHO-NEXT: br x0
94-
; MACHO-NEXT: .loh AdrpLdrGot Lloh2, Lloh3
83+
; MACHO-NEXT: .loh AdrpLdrGot Lloh4, Lloh5
9584
;
9685
; MACHO-NORMAL-LABEL: test_laziness_tail:
9786
; MACHO-NORMAL: ; %bb.0:
9887
; MACHO-NORMAL-NEXT: b _external
9988
;
10089
; ELF-LABEL: test_laziness_tail:
10190
; ELF: // %bb.0:
102-
; ELF-NEXT: b external
91+
; ELF-NEXT: adrp x0, :got:external
92+
; ELF-NEXT: ldr x0, [x0, :got_lo12:external]
93+
; ELF-NEXT: br x0
10394
tail call void @external()
10495
ret void
10596
}
@@ -108,3 +99,7 @@ declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
10899

109100
!llvm.module.flags = !{!0}
110101
!0 = !{i32 7, !"RtLibUseGOT", i32 1}
102+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
103+
; ELF-FI: {{.*}}
104+
; ELF-GI: {{.*}}
105+
; ELF-SDAG: {{.*}}

0 commit comments

Comments
 (0)