[PATCH] D57277: [COFF, ARM64] Don't put jump table into a separate COFF section for EK_LabelDifference32
Tom Tan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 26 19:45:43 PST 2019
TomTan updated this revision to Diff 183745.
TomTan edited the summary of this revision.
TomTan added a comment.
Added `CHECK-NEXT` on the jump table label based on Martin's feedback.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D57277/new/
https://reviews.llvm.org/D57277
Files:
lib/Target/AArch64/AArch64AsmPrinter.cpp
lib/Target/AArch64/AArch64TargetMachine.cpp
test/CodeGen/AArch64/win64-jumptable.ll
Index: test/CodeGen/AArch64/win64-jumptable.ll
===================================================================
--- /dev/null
+++ test/CodeGen/AArch64/win64-jumptable.ll
@@ -0,0 +1,48 @@
+; RUN: llc -o - %s -mtriple=aarch64-windows -aarch64-enable-compress-jump-tables=0 | FileCheck %s
+
+define void @f(i32 %x) {
+entry:
+ switch i32 %x, label %sw.epilog [
+ i32 0, label %sw.bb
+ i32 1, label %sw.bb1
+ i32 2, label %sw.bb2
+ i32 3, label %sw.bb3
+ ]
+
+sw.bb: ; preds = %entry
+ tail call void @g(i32 0) #2
+ br label %sw.epilog
+
+sw.bb1: ; preds = %entry
+ tail call void @g(i32 1) #2
+ br label %sw.epilog
+
+sw.bb2: ; preds = %entry
+ tail call void @g(i32 2) #2
+ br label %sw.epilog
+
+sw.bb3: ; preds = %entry
+ tail call void @g(i32 3) #2
+ br label %sw.epilog
+
+sw.epilog: ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb
+ tail call void @g(i32 10) #2
+ ret void
+}
+
+declare void @g(i32)
+
+; CHECK: .text
+; CHECK: f:
+; CHECK: .seh_proc f
+; CHECK: b g
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: .LJTI0_0:
+; CHECK: .word .LBB0_2-.LJTI0_0
+; CHECK: .word .LBB0_3-.LJTI0_0
+; CHECK: .word .LBB0_4-.LJTI0_0
+; CHECK: .word .LBB0_5-.LJTI0_0
+; CHECK: .section .xdata,"dr"
+; CHECK: .seh_handlerdata
+; CHECK: .text
+; CHECK: .seh_endproc
Index: lib/Target/AArch64/AArch64TargetMachine.cpp
===================================================================
--- lib/Target/AArch64/AArch64TargetMachine.cpp
+++ lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -208,8 +208,8 @@
static Reloc::Model getEffectiveRelocModel(const Triple &TT,
Optional<Reloc::Model> RM) {
- // AArch64 Darwin is always PIC.
- if (TT.isOSDarwin())
+ // AArch64 Darwin and Windows are always PIC.
+ if (TT.isOSDarwin() || TT.isOSWindows())
return Reloc::PIC_;
// On ELF platforms the default static relocation model has a smart enough
// linker to cope with referencing external symbols defined in a shared
Index: lib/Target/AArch64/AArch64AsmPrinter.cpp
===================================================================
--- lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -578,9 +578,16 @@
const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
if (JT.empty()) return;
+ const Function &F = MF->getFunction();
const TargetLoweringObjectFile &TLOF = getObjFileLowering();
- MCSection *ReadOnlySec = TLOF.getSectionForJumpTable(MF->getFunction(), TM);
- OutStreamer->SwitchSection(ReadOnlySec);
+ bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection(
+ MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32,
+ F);
+ if (JTInDiffSection) {
+ // Drop it in the readonly section.
+ MCSection *ReadOnlySec = TLOF.getSectionForJumpTable(F, TM);
+ OutStreamer->SwitchSection(ReadOnlySec);
+ }
auto AFI = MF->getInfo<AArch64FunctionInfo>();
for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57277.183745.patch
Type: text/x-patch
Size: 3220 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190127/c6ee28f9/attachment.bin>
More information about the llvm-commits
mailing list