Skip to content

Commit e7c56da

Browse files
Merge pull request #3695 from aschwaighofer/weak_swift_async_extendedFramePointerFlags_rdar_86432570_20210726
Teach the backend to make references to swift_async_extendedFramePointerFlags weak if it emits it
2 parents b4bb480 + b1368f1 commit e7c56da

File tree

7 files changed

+47
-0
lines changed

7 files changed

+47
-0
lines changed

llvm/include/llvm/CodeGen/AsmPrinter.h

+5
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,11 @@ class AsmPrinter : public MachineFunctionPass {
812812

813813
/// This method decides whether the specified basic block requires a label.
814814
bool shouldEmitLabelForBasicBlock(const MachineBasicBlock &MBB) const;
815+
816+
protected:
817+
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const {
818+
return false;
819+
}
815820
};
816821

817822
} // end namespace llvm

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -1842,6 +1842,17 @@ bool AsmPrinter::doFinalization(Module &M) {
18421842
continue;
18431843
OutStreamer->emitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
18441844
}
1845+
if (shouldEmitWeakSwiftAsyncExtendedFramePointerFlags()) {
1846+
auto SymbolName = "swift_async_extendedFramePointerFlags";
1847+
auto Global = M.getGlobalVariable(SymbolName);
1848+
if (!Global) {
1849+
auto Int8PtrTy = Type::getInt8PtrTy(M.getContext());
1850+
Global = new GlobalVariable(M, Int8PtrTy, false,
1851+
GlobalValue::ExternalWeakLinkage, nullptr,
1852+
SymbolName);
1853+
OutStreamer->emitSymbolAttribute(getSymbol(Global), MCSA_WeakReference);
1854+
}
1855+
}
18451856
}
18461857

18471858
// Print aliases in topological order, that is, for each alias a = b,

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class AArch64AsmPrinter : public AsmPrinter {
8686
StackMaps SM;
8787
FaultMaps FM;
8888
const AArch64Subtarget *STI;
89+
bool ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags = false;
8990

9091
public:
9192
AArch64AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
@@ -202,6 +203,10 @@ class AArch64AsmPrinter : public AsmPrinter {
202203
using MInstToMCSymbol = std::map<const MachineInstr *, MCSymbol *>;
203204

204205
MInstToMCSymbol LOHInstToLabel;
206+
207+
bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const override {
208+
return ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags;
209+
}
205210
};
206211

207212
} // end anonymous namespace
@@ -1225,6 +1230,15 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
12251230
if (emitPseudoExpansionLowering(*OutStreamer, MI))
12261231
return;
12271232

1233+
if (MI->getOpcode() == AArch64::ADRP) {
1234+
for (auto &Opd : MI->operands()) {
1235+
if (Opd.isSymbol() && StringRef(Opd.getSymbolName()) ==
1236+
"swift_async_extendedFramePointerFlags") {
1237+
ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags = true;
1238+
}
1239+
}
1240+
}
1241+
12281242
if (AArch64FI->getLOHRelated().count(MI)) {
12291243
// Generate a label for LOH related instruction
12301244
MCSymbol *LOHLabel = createTempSymbol("loh");

llvm/lib/Target/X86/X86AsmPrinter.h

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
3030
FaultMaps FM;
3131
std::unique_ptr<MCCodeEmitter> CodeEmitter;
3232
bool EmitFPOData = false;
33+
bool ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags = false;
3334
bool NeedsRetpoline = false;
3435

3536
// This utility class tracks the length of a stackmap instruction's 'shadow'.
@@ -148,6 +149,10 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
148149
bool runOnMachineFunction(MachineFunction &MF) override;
149150
void emitFunctionBodyStart() override;
150151
void emitFunctionBodyEnd() override;
152+
153+
bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const override {
154+
return ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags;
155+
}
151156
};
152157

153158
} // end namespace llvm

llvm/lib/Target/X86/X86MCInstLower.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -2371,6 +2371,15 @@ void X86AsmPrinter::emitInstruction(const MachineInstr *MI) {
23712371
const X86RegisterInfo *RI =
23722372
MF->getSubtarget<X86Subtarget>().getRegisterInfo();
23732373

2374+
if (MI->getOpcode() == X86::OR64rm) {
2375+
for (auto &Opd : MI->operands()) {
2376+
if (Opd.isSymbol() && StringRef(Opd.getSymbolName()) ==
2377+
"swift_async_extendedFramePointerFlags") {
2378+
ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags = true;
2379+
}
2380+
}
2381+
}
2382+
23742383
// Add a comment about EVEX-2-VEX compression for AVX-512 instrs that
23752384
// are compressed from EVEX encoding to VEX encoding.
23762385
if (TM.Options.MCOptions.ShowMCEncoding) {

llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll

+2
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
; CHECK-DYNAMIC: adrp x16, _swift_async_extendedFramePointerFlags@GOTPAGE
2424
; CHECK-DYNAMIC: ldr x16, [x16, _swift_async_extendedFramePointerFlags@GOTPAGEOFF]
2525
; CHECK-DYNAMIC: orr x29, x29, x16
26+
; CHECK-DYNAMIC: .weak_reference _swift_async_extendedFramePointerFlags
2627

2728
; CHECK-DYNAMIC-32-LABEL: foo:
2829
; CHECK-DYNAMIC-32: adrp x16, _swift_async_extendedFramePointerFlags@GOTPAGE
2930
; CHECK-DYNAMIC-32: ldr w16, [x16, _swift_async_extendedFramePointerFlags@GOTPAGEOFF]
3031
; CHECK-DYNAMIC-32: orr x29, x29, x16, lsl #32
32+
; CHECK-DYNAMIC-32: .weak_reference _swift_async_extendedFramePointerFlags
3133

3234
define void @foo(i8* swiftasync) "frame-pointer"="all" {
3335
ret void

llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
; CHECK-DYNAMIC-LABEL: foo:
1414
; CHECK-DYNAMIC: orq _swift_async_extendedFramePointerFlags@GOTPCREL(%rip), %rbp
15+
; CHECK-DYNAMIC: .weak_reference _swift_async_extendedFramePointerFlags
1516

1617
; CHECK-NEVER-LABEL: foo:
1718
; CHECK-NEVER-NOT: btsq $60, %rbp

0 commit comments

Comments
 (0)