From 45968c54e94b306e8c65d97a829ab5b68102963c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 21 Oct 2014 01:17:30 +0000 Subject: [PATCH] Fix a bit of confusion about .set and produce more readable assembly. Every target we support has support for assembly that looks like a = b - c .long a What is special about MachO is that the above combination suppresses the production of a relocation. With this change we avoid producing the intermediary labels when they don't add any value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220256 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAsmInfo.h | 12 +++-- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 58 ++++++++++-------------- lib/MC/MCAsmInfo.cpp | 2 +- lib/MC/MCAsmInfoDarwin.cpp | 1 + lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp | 2 - lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp | 1 - lib/Target/X86/X86MCInstLower.cpp | 3 +- test/CodeGen/AArch64/jump-table.ll | 18 +++----- test/CodeGen/X86/2010-05-25-DotDebugLoc.ll | 3 +- test/CodeGen/X86/patchpoint-invoke.ll | 6 +-- test/CodeGen/XCore/exception.ll | 15 ++---- test/DebugInfo/X86/debug-loc-asan.ll | 12 ++--- test/DebugInfo/X86/dwarf-aranges.ll | 9 ++-- test/DebugInfo/X86/multiple-aranges.ll | 6 +-- test/DebugInfo/X86/pr19307.ll | 6 +-- 15 files changed, 63 insertions(+), 91 deletions(-) diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 4edc8805264..bb48188657a 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -223,8 +223,12 @@ protected: /// This is the directive used to declare a global entity. Defaults to NULL. const char *GlobalDirective; - /// True if the assembler supports the .set directive. Defaults to true. - bool HasSetDirective; + /// True if the expression + /// .long f - g + /// uses an relocation but it can be supressed by writting + /// a = f - g + /// .long a + bool SetDirectiveSuppressesReloc; /// False if the assembler requires that we use /// \code @@ -442,7 +446,9 @@ public: bool getAlignmentIsInBytes() const { return AlignmentIsInBytes; } unsigned getTextAlignFillValue() const { return TextAlignFillValue; } const char *getGlobalDirective() const { return GlobalDirective; } - bool hasSetDirective() const { return HasSetDirective; } + bool doesSetDirectiveSuppressesReloc() const { + return SetDirectiveSuppressesReloc; + } bool hasAggressiveSymbolFolding() const { return HasAggressiveSymbolFolding; } bool getCOMMDirectiveAlignmentIsInBytes() const { return COMMDirectiveAlignmentIsInBytes; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index dd0d40dc0c3..260f39cebf6 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -962,24 +962,21 @@ bool AsmPrinter::doFinalization(Module &M) { } } - if (MAI->hasSetDirective()) { - OutStreamer.AddBlankLine(); - for (const auto &Alias : M.aliases()) { - MCSymbol *Name = getSymbol(&Alias); + OutStreamer.AddBlankLine(); + for (const auto &Alias : M.aliases()) { + MCSymbol *Name = getSymbol(&Alias); - if (Alias.hasExternalLinkage() || !MAI->getWeakRefDirective()) - OutStreamer.EmitSymbolAttribute(Name, MCSA_Global); - else if (Alias.hasWeakLinkage() || Alias.hasLinkOnceLinkage()) - OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference); - else - assert(Alias.hasLocalLinkage() && "Invalid alias linkage"); + if (Alias.hasExternalLinkage() || !MAI->getWeakRefDirective()) + OutStreamer.EmitSymbolAttribute(Name, MCSA_Global); + else if (Alias.hasWeakLinkage() || Alias.hasLinkOnceLinkage()) + OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference); + else + assert(Alias.hasLocalLinkage() && "Invalid alias linkage"); - EmitVisibility(Name, Alias.getVisibility()); + EmitVisibility(Name, Alias.getVisibility()); - // Emit the directives as assignments aka .set: - OutStreamer.EmitAssignment(Name, - lowerConstant(Alias.getAliasee(), *this)); - } + // Emit the directives as assignments aka .set: + OutStreamer.EmitAssignment(Name, lowerConstant(Alias.getAliasee(), *this)); } GCModuleInfo *MI = getAnalysisIfAvailable(); @@ -1163,11 +1160,10 @@ void AsmPrinter::EmitJumpTableInfo() { // If this jump table was deleted, ignore it. if (JTBBs.empty()) continue; - // For the EK_LabelDifference32 entry, if the target supports .set, emit a - // .set directive for each unique entry. This reduces the number of - // relocations the assembler will generate for the jump table. + // For the EK_LabelDifference32 entry, if using .set avoids a relocation, + /// emit a .set directive for each unique entry. if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 && - MAI->hasSetDirective()) { + MAI->doesSetDirectiveSuppressesReloc()) { SmallPtrSet EmittedSets; const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext); @@ -1240,24 +1236,18 @@ void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, } case MachineJumpTableInfo::EK_LabelDifference32: { - // EK_LabelDifference32 - Each entry is the address of the block minus - // the address of the jump table. This is used for PIC jump tables where - // gprel32 is not supported. e.g.: + // Each entry is the address of the block minus the address of the jump + // table. This is used for PIC jump tables where gprel32 is not supported. + // e.g.: // .word LBB123 - LJTI1_2 - // If the .set directive is supported, this is emitted as: + // If the .set directive avoids relocations, this is emitted as: // .set L4_5_set_123, LBB123 - LJTI1_2 // .word L4_5_set_123 - - // If we have emitted set directives for the jump table entries, print - // them rather than the entries themselves. If we're emitting PIC, then - // emit the table entries as differences between two text section labels. - if (MAI->hasSetDirective()) { - // If we used .set, reference the .set's symbol. + if (MAI->doesSetDirectiveSuppressesReloc()) { Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()), OutContext); break; } - // Otherwise, use the difference as the jump table entry. Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext); Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext); @@ -1441,9 +1431,9 @@ void AsmPrinter::EmitInt32(int Value) const { OutStreamer.EmitIntValue(Value, 4); } -/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size -/// in bytes of the directive is specified by Size and Hi/Lo specify the -/// labels. This implicitly uses .set if it is available. +/// Emit something like ".long Hi-Lo" where the size in bytes of the directive +/// is specified by Size and Hi/Lo specify the labels. This implicitly uses +/// .set if it avoids relocations. void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const { // Get the Hi-Lo expression. @@ -1452,7 +1442,7 @@ void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, MCSymbolRefExpr::Create(Lo, OutContext), OutContext); - if (!MAI->hasSetDirective()) { + if (!MAI->doesSetDirectiveSuppressesReloc()) { OutStreamer.EmitValue(Diff, Size); return; } diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index ed3d5edb2e7..7574edbcbe8 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -64,7 +64,7 @@ MCAsmInfo::MCAsmInfo() { GPRel64Directive = nullptr; GPRel32Directive = nullptr; GlobalDirective = "\t.globl\t"; - HasSetDirective = true; + SetDirectiveSuppressesReloc = false; HasAggressiveSymbolFolding = true; COMMDirectiveAlignmentIsInBytes = true; LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; diff --git a/lib/MC/MCAsmInfoDarwin.cpp b/lib/MC/MCAsmInfoDarwin.cpp index eaf28dd4cf7..96fe216d0d6 100644 --- a/lib/MC/MCAsmInfoDarwin.cpp +++ b/lib/MC/MCAsmInfoDarwin.cpp @@ -60,4 +60,5 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { DwarfUsesRelocationsAcrossSections = false; UseIntegratedAssembler = true; + SetDirectiveSuppressesReloc = true; } diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp index 295d03721a6..4fd5bdda8c7 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp @@ -33,8 +33,6 @@ NVPTXMCAsmInfo::NVPTXMCAsmInfo(StringRef TT) { CommentString = "//"; - HasSetDirective = false; - HasSingleParameterDotFile = false; InlineAsmStart = " inline asm"; diff --git a/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp b/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp index f332e4da0df..fa268e6cb32 100644 --- a/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp +++ b/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp @@ -35,7 +35,6 @@ AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(StringRef &TT) : MCAsmInfoELF() { //===--- Global Variable Emission Directives --------------------------===// GlobalDirective = ".global"; - HasSetDirective = false; HasAggressiveSymbolFolding = true; COMMDirectiveAlignmentIsInBytes = false; HasDotTypeDotSizeDirective = false; diff --git a/lib/Target/X86/X86MCInstLower.cpp b/lib/Target/X86/X86MCInstLower.cpp index 39281c8915d..fc3662e6bec 100644 --- a/lib/Target/X86/X86MCInstLower.cpp +++ b/lib/Target/X86/X86MCInstLower.cpp @@ -264,7 +264,8 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO, Expr = MCBinaryExpr::CreateSub(Expr, MCSymbolRefExpr::Create(MF.getPICBaseSymbol(), Ctx), Ctx); - if (MO.isJTI() && MAI.hasSetDirective()) { + if (MO.isJTI()) { + assert(MAI.doesSetDirectiveSuppressesReloc()); // If .set directive is supported, use it to reduce the number of // relocations the assembler will generate for differences between // local labels. This is only safe when the symbols are in the same diff --git a/test/CodeGen/AArch64/jump-table.ll b/test/CodeGen/AArch64/jump-table.ll index 73b8dc503fc..16682e92c17 100644 --- a/test/CodeGen/AArch64/jump-table.ll +++ b/test/CodeGen/AArch64/jump-table.ll @@ -56,15 +56,11 @@ lbl4: ; CHECK-NEXT: .xword ; CHECK-PIC-NOT: .data_region -; CHECK-PIC: .L[[VAR1:.*]] = .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .L[[VAR2:.*]] = .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .L[[VAR3:.*]] = .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .L[[VAR4:.*]] = .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .L[[VAR5:.*]] = .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .LJTI0_0: -; CHECK-PIC-NEXT: .word .L[[VAR1]] -; CHECK-PIC-NEXT: .word .L[[VAR2]] -; CHECK-PIC-NEXT: .word .L[[VAR3]] -; CHECK-PIC-NEXT: .word .L[[VAR4]] -; CHECK-PIC-NEXT: .word .L[[VAR5]] +; CHECK-PIC-NOT: .LJTI0_0 +; CHECK-PIC: .LJTI0_0: +; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 +; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 +; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 +; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 +; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 ; CHECK-PIC-NOT: .end_data_region diff --git a/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll b/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll index f4c3f9d3b36..1998011f219 100644 --- a/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll +++ b/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll @@ -2,8 +2,7 @@ ; RUN: llc -mtriple=x86_64-pc-linux -O2 -regalloc=basic < %s | FileCheck %s ; Test to check .debug_loc support. This test case emits many debug_loc entries. -; CHECK: Loc expr size -; CHECK-NEXT: .short +; CHECK: .short {{.*}} # Loc expr size ; CHECK-NEXT: .Ltmp ; CHECK-NEXT: DW_OP_reg diff --git a/test/CodeGen/X86/patchpoint-invoke.ll b/test/CodeGen/X86/patchpoint-invoke.ll index d5d4df55ee4..192cacc908a 100644 --- a/test/CodeGen/X86/patchpoint-invoke.ll +++ b/test/CodeGen/X86/patchpoint-invoke.ll @@ -38,10 +38,8 @@ threw: ; CHECK-NEXT: .byte 3 ; CHECK-NEXT: .byte 13 ; Verify that the unwind data covers the entire patchpoint region: -; CHECK-NEXT: [[RANGE_OFFSET:.L[^ ]*]] = .Ltmp0-[[FUNC_BEGIN]] -; CHECK-NEXT: .long [[RANGE_OFFSET]] -; CHECK-NEXT: [[RANGE_LENGTH:.L[^ ]*]] = [[PP_END]]-.Ltmp0 -; CHECK-NEXT: .long [[RANGE_LENGTH]] +; CHECK-NEXT: .long .Ltmp0-[[FUNC_BEGIN]] +; CHECK-NEXT: .long [[PP_END]]-.Ltmp0 ; Verify that the stackmap section got emitted: diff --git a/test/CodeGen/XCore/exception.ll b/test/CodeGen/XCore/exception.ll index 3179fcdfcf5..fec83eb15ea 100644 --- a/test/CodeGen/XCore/exception.ll +++ b/test/CodeGen/XCore/exception.ll @@ -107,17 +107,12 @@ Exit: ; CHECK: .asciiz ; CHECK: .byte 3 ; CHECK: .byte 26 -; CHECK: [[SET0:.L[a-zA-Z0-9_]+]] = [[PRE_G]]-[[START]] -; CHECK: .long [[SET0]] -; CHECK: [[SET1:.L[a-zA-Z0-9_]+]] = [[POST_G]]-[[PRE_G]] -; CHECK: .long [[SET1]] -; CHECK: [[SET2:.L[a-zA-Z0-9_]+]] = [[LANDING]]-[[START]] -; CHECK: .long [[SET2]] +; CHECK: .long [[PRE_G]]-[[START]] +; CHECK: .long [[POST_G]]-[[PRE_G]] +; CHECK: .long [[LANDING]]-[[START]] ; CHECK: .byte 3 -; CHECK: [[SET3:.L[a-zA-Z0-9_]+]] = [[POST_G]]-[[START]] -; CHECK: .long [[SET3]] -; CHECK: [[SET4:.L[a-zA-Z0-9_]+]] = [[END]]-[[POST_G]] -; CHECK: .long [[SET4]] +; CHECK: .long [[POST_G]]-[[START]] +; CHECK: .long [[END]]-[[POST_G]] ; CHECK: .long 0 ; CHECK: .byte 0 ; CHECK: .byte 1 diff --git a/test/DebugInfo/X86/debug-loc-asan.ll b/test/DebugInfo/X86/debug-loc-asan.ll index 907589a872e..869db75c04f 100644 --- a/test/DebugInfo/X86/debug-loc-asan.ll +++ b/test/DebugInfo/X86/debug-loc-asan.ll @@ -22,17 +22,13 @@ ; We expect two location ranges for the variable. ; First, it is stored in %rdx: -; CHECK: .Lset{{[0-9]+}} = .Lfunc_begin0-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} -; CHECK-NEXT: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: .quad .Lfunc_begin0-.Lfunc_begin0 +; CHECK-NEXT: .quad [[START_LABEL]]-.Lfunc_begin0 ; CHECK: DW_OP_reg5 ; Then it's addressed via %rsp: -; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} -; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0 +; CHECK-NEXT: .Lfunc_end0-.Lfunc_begin0 ; CHECK: DW_OP_breg7 ; CHECK-NEXT: [[OFFSET]] ; CHECK: DW_OP_deref diff --git a/test/DebugInfo/X86/dwarf-aranges.ll b/test/DebugInfo/X86/dwarf-aranges.ll index e3d6f5cea5e..237e418b4ee 100644 --- a/test/DebugInfo/X86/dwarf-aranges.ll +++ b/test/DebugInfo/X86/dwarf-aranges.ll @@ -15,18 +15,15 @@ ; - it should have made one span covering all vars in this CU. ; CHECK-NEXT: .quad some_data -; CHECK-NEXT: [[R1:\.[A-Za-z0-9]*]] = .Ldebug_end1-some_data -; CHECK-NEXT: .quad [[R1]] +; CHECK-NEXT: .quad .Ldebug_end1-some_data ; - it should have made one span covering all functions in this CU. ; CHECK-NEXT: .quad .Lfunc_begin0 -; CHECK-NEXT: [[R2:\.[A-Za-z0-9]*]] = .Ldebug_end2-.Lfunc_begin0 -; CHECK-NEXT: .quad [[R2]] +; CHECK-NEXT: .quad .Ldebug_end2-.Lfunc_begin0 ; - it should have made one span covering all vars in this CU. ; CHECK-NEXT: .quad some_other -; CHECK-NEXT: [[R3:\.[A-Za-z0-9]*]] = .Ldebug_end3-some_other -; CHECK-NEXT: .quad [[R3]] +; CHECK-NEXT: .quad .Ldebug_end3-some_other ; -- finish -- ; CHECK-NEXT: # ARange terminator diff --git a/test/DebugInfo/X86/multiple-aranges.ll b/test/DebugInfo/X86/multiple-aranges.ll index 6d796dcef59..47eef2d6cd7 100644 --- a/test/DebugInfo/X86/multiple-aranges.ll +++ b/test/DebugInfo/X86/multiple-aranges.ll @@ -8,8 +8,7 @@ ; CHECK-NEXT: .byte 0 # Segment Size (in bytes) ; CHECK-NEXT: .zero 4,255 ; CHECK-NEXT: .quad kittens -; CHECK-NEXT: .Lset0 = rainbows-kittens -; CHECK-NEXT: .quad .Lset0 +; CHECK-NEXT: .quad rainbows-kittens ; CHECK-NEXT: .quad 0 # ARange terminator ; CHECK-NEXT: .quad 0 @@ -21,8 +20,7 @@ ; CHECK-NEXT: .byte 0 # Segment Size (in bytes) ; CHECK-NEXT: .zero 4,255 ; CHECK-NEXT: .quad rainbows -; CHECK-NEXT: .Lset1 = .Ldebug_end0-rainbows -; CHECK-NEXT: .quad .Lset1 +; CHECK-NEXT: .quad .Ldebug_end0-rainbows ; CHECK-NEXT: .quad 0 # ARange terminator ; CHECK-NEXT: .quad 0 diff --git a/test/DebugInfo/X86/pr19307.ll b/test/DebugInfo/X86/pr19307.ll index 0da8b1d0699..4223cb789bd 100644 --- a/test/DebugInfo/X86/pr19307.ll +++ b/test/DebugInfo/X86/pr19307.ll @@ -20,10 +20,8 @@ ; Verify that we have proper range in debug_loc section: ; CHECK: .Ldebug_loc{{[0-9]+}}: ; CHECK: DW_OP_breg1 -; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} -; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lfunc_end0-.Lfunc_begin0 ; CHECK: DW_OP_breg6 ; CHECK: DW_OP_deref -- 2.11.0