mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-06 23:31:48 +00:00
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
This commit is contained in:
parent
f8c9d3d3c2
commit
45968c54e9
@ -223,8 +223,12 @@ protected:
|
|||||||
/// This is the directive used to declare a global entity. Defaults to NULL.
|
/// This is the directive used to declare a global entity. Defaults to NULL.
|
||||||
const char *GlobalDirective;
|
const char *GlobalDirective;
|
||||||
|
|
||||||
/// True if the assembler supports the .set directive. Defaults to true.
|
/// True if the expression
|
||||||
bool HasSetDirective;
|
/// .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
|
/// False if the assembler requires that we use
|
||||||
/// \code
|
/// \code
|
||||||
@ -442,7 +446,9 @@ public:
|
|||||||
bool getAlignmentIsInBytes() const { return AlignmentIsInBytes; }
|
bool getAlignmentIsInBytes() const { return AlignmentIsInBytes; }
|
||||||
unsigned getTextAlignFillValue() const { return TextAlignFillValue; }
|
unsigned getTextAlignFillValue() const { return TextAlignFillValue; }
|
||||||
const char *getGlobalDirective() const { return GlobalDirective; }
|
const char *getGlobalDirective() const { return GlobalDirective; }
|
||||||
bool hasSetDirective() const { return HasSetDirective; }
|
bool doesSetDirectiveSuppressesReloc() const {
|
||||||
|
return SetDirectiveSuppressesReloc;
|
||||||
|
}
|
||||||
bool hasAggressiveSymbolFolding() const { return HasAggressiveSymbolFolding; }
|
bool hasAggressiveSymbolFolding() const { return HasAggressiveSymbolFolding; }
|
||||||
bool getCOMMDirectiveAlignmentIsInBytes() const {
|
bool getCOMMDirectiveAlignmentIsInBytes() const {
|
||||||
return COMMDirectiveAlignmentIsInBytes;
|
return COMMDirectiveAlignmentIsInBytes;
|
||||||
|
@ -962,24 +962,21 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAI->hasSetDirective()) {
|
OutStreamer.AddBlankLine();
|
||||||
OutStreamer.AddBlankLine();
|
for (const auto &Alias : M.aliases()) {
|
||||||
for (const auto &Alias : M.aliases()) {
|
MCSymbol *Name = getSymbol(&Alias);
|
||||||
MCSymbol *Name = getSymbol(&Alias);
|
|
||||||
|
|
||||||
if (Alias.hasExternalLinkage() || !MAI->getWeakRefDirective())
|
if (Alias.hasExternalLinkage() || !MAI->getWeakRefDirective())
|
||||||
OutStreamer.EmitSymbolAttribute(Name, MCSA_Global);
|
OutStreamer.EmitSymbolAttribute(Name, MCSA_Global);
|
||||||
else if (Alias.hasWeakLinkage() || Alias.hasLinkOnceLinkage())
|
else if (Alias.hasWeakLinkage() || Alias.hasLinkOnceLinkage())
|
||||||
OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference);
|
OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference);
|
||||||
else
|
else
|
||||||
assert(Alias.hasLocalLinkage() && "Invalid alias linkage");
|
assert(Alias.hasLocalLinkage() && "Invalid alias linkage");
|
||||||
|
|
||||||
EmitVisibility(Name, Alias.getVisibility());
|
EmitVisibility(Name, Alias.getVisibility());
|
||||||
|
|
||||||
// Emit the directives as assignments aka .set:
|
// Emit the directives as assignments aka .set:
|
||||||
OutStreamer.EmitAssignment(Name,
|
OutStreamer.EmitAssignment(Name, lowerConstant(Alias.getAliasee(), *this));
|
||||||
lowerConstant(Alias.getAliasee(), *this));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
|
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
|
||||||
@ -1163,11 +1160,10 @@ void AsmPrinter::EmitJumpTableInfo() {
|
|||||||
// If this jump table was deleted, ignore it.
|
// If this jump table was deleted, ignore it.
|
||||||
if (JTBBs.empty()) continue;
|
if (JTBBs.empty()) continue;
|
||||||
|
|
||||||
// For the EK_LabelDifference32 entry, if the target supports .set, emit a
|
// For the EK_LabelDifference32 entry, if using .set avoids a relocation,
|
||||||
// .set directive for each unique entry. This reduces the number of
|
/// emit a .set directive for each unique entry.
|
||||||
// relocations the assembler will generate for the jump table.
|
|
||||||
if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 &&
|
if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 &&
|
||||||
MAI->hasSetDirective()) {
|
MAI->doesSetDirectiveSuppressesReloc()) {
|
||||||
SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets;
|
SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets;
|
||||||
const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
||||||
const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext);
|
const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext);
|
||||||
@ -1240,24 +1236,18 @@ void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
|||||||
}
|
}
|
||||||
|
|
||||||
case MachineJumpTableInfo::EK_LabelDifference32: {
|
case MachineJumpTableInfo::EK_LabelDifference32: {
|
||||||
// EK_LabelDifference32 - Each entry is the address of the block minus
|
// Each entry is the address of the block minus the address of the jump
|
||||||
// the address of the jump table. This is used for PIC jump tables where
|
// table. This is used for PIC jump tables where gprel32 is not supported.
|
||||||
// gprel32 is not supported. e.g.:
|
// e.g.:
|
||||||
// .word LBB123 - LJTI1_2
|
// .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
|
// .set L4_5_set_123, LBB123 - LJTI1_2
|
||||||
// .word L4_5_set_123
|
// .word L4_5_set_123
|
||||||
|
if (MAI->doesSetDirectiveSuppressesReloc()) {
|
||||||
// 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.
|
|
||||||
Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()),
|
Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()),
|
||||||
OutContext);
|
OutContext);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Otherwise, use the difference as the jump table entry.
|
|
||||||
Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
|
Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
|
||||||
const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext);
|
const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext);
|
||||||
Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext);
|
Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext);
|
||||||
@ -1441,9 +1431,9 @@ void AsmPrinter::EmitInt32(int Value) const {
|
|||||||
OutStreamer.EmitIntValue(Value, 4);
|
OutStreamer.EmitIntValue(Value, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
|
/// Emit something like ".long Hi-Lo" where the size in bytes of the directive
|
||||||
/// in bytes of the directive is specified by Size and Hi/Lo specify the
|
/// is specified by Size and Hi/Lo specify the labels. This implicitly uses
|
||||||
/// labels. This implicitly uses .set if it is available.
|
/// .set if it avoids relocations.
|
||||||
void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
|
void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
|
||||||
unsigned Size) const {
|
unsigned Size) const {
|
||||||
// Get the Hi-Lo expression.
|
// Get the Hi-Lo expression.
|
||||||
@ -1452,7 +1442,7 @@ void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
|
|||||||
MCSymbolRefExpr::Create(Lo, OutContext),
|
MCSymbolRefExpr::Create(Lo, OutContext),
|
||||||
OutContext);
|
OutContext);
|
||||||
|
|
||||||
if (!MAI->hasSetDirective()) {
|
if (!MAI->doesSetDirectiveSuppressesReloc()) {
|
||||||
OutStreamer.EmitValue(Diff, Size);
|
OutStreamer.EmitValue(Diff, Size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ MCAsmInfo::MCAsmInfo() {
|
|||||||
GPRel64Directive = nullptr;
|
GPRel64Directive = nullptr;
|
||||||
GPRel32Directive = nullptr;
|
GPRel32Directive = nullptr;
|
||||||
GlobalDirective = "\t.globl\t";
|
GlobalDirective = "\t.globl\t";
|
||||||
HasSetDirective = true;
|
SetDirectiveSuppressesReloc = false;
|
||||||
HasAggressiveSymbolFolding = true;
|
HasAggressiveSymbolFolding = true;
|
||||||
COMMDirectiveAlignmentIsInBytes = true;
|
COMMDirectiveAlignmentIsInBytes = true;
|
||||||
LCOMMDirectiveAlignmentType = LCOMM::NoAlignment;
|
LCOMMDirectiveAlignmentType = LCOMM::NoAlignment;
|
||||||
|
@ -60,4 +60,5 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
|
|||||||
DwarfUsesRelocationsAcrossSections = false;
|
DwarfUsesRelocationsAcrossSections = false;
|
||||||
|
|
||||||
UseIntegratedAssembler = true;
|
UseIntegratedAssembler = true;
|
||||||
|
SetDirectiveSuppressesReloc = true;
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,6 @@ NVPTXMCAsmInfo::NVPTXMCAsmInfo(StringRef TT) {
|
|||||||
|
|
||||||
CommentString = "//";
|
CommentString = "//";
|
||||||
|
|
||||||
HasSetDirective = false;
|
|
||||||
|
|
||||||
HasSingleParameterDotFile = false;
|
HasSingleParameterDotFile = false;
|
||||||
|
|
||||||
InlineAsmStart = " inline asm";
|
InlineAsmStart = " inline asm";
|
||||||
|
@ -35,7 +35,6 @@ AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(StringRef &TT) : MCAsmInfoELF() {
|
|||||||
|
|
||||||
//===--- Global Variable Emission Directives --------------------------===//
|
//===--- Global Variable Emission Directives --------------------------===//
|
||||||
GlobalDirective = ".global";
|
GlobalDirective = ".global";
|
||||||
HasSetDirective = false;
|
|
||||||
HasAggressiveSymbolFolding = true;
|
HasAggressiveSymbolFolding = true;
|
||||||
COMMDirectiveAlignmentIsInBytes = false;
|
COMMDirectiveAlignmentIsInBytes = false;
|
||||||
HasDotTypeDotSizeDirective = false;
|
HasDotTypeDotSizeDirective = false;
|
||||||
|
@ -264,7 +264,8 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
|||||||
Expr = MCBinaryExpr::CreateSub(Expr,
|
Expr = MCBinaryExpr::CreateSub(Expr,
|
||||||
MCSymbolRefExpr::Create(MF.getPICBaseSymbol(), Ctx),
|
MCSymbolRefExpr::Create(MF.getPICBaseSymbol(), Ctx),
|
||||||
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
|
// If .set directive is supported, use it to reduce the number of
|
||||||
// relocations the assembler will generate for differences between
|
// relocations the assembler will generate for differences between
|
||||||
// local labels. This is only safe when the symbols are in the same
|
// local labels. This is only safe when the symbols are in the same
|
||||||
|
@ -56,15 +56,11 @@ lbl4:
|
|||||||
; CHECK-NEXT: .xword
|
; CHECK-NEXT: .xword
|
||||||
|
|
||||||
; CHECK-PIC-NOT: .data_region
|
; CHECK-PIC-NOT: .data_region
|
||||||
; CHECK-PIC: .L[[VAR1:.*]] = .LBB{{.*}}-.LJTI0_0
|
; CHECK-PIC-NOT: .LJTI0_0
|
||||||
; CHECK-PIC-NEXT: .L[[VAR2:.*]] = .LBB{{.*}}-.LJTI0_0
|
; CHECK-PIC: .LJTI0_0:
|
||||||
; CHECK-PIC-NEXT: .L[[VAR3:.*]] = .LBB{{.*}}-.LJTI0_0
|
; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0
|
||||||
; CHECK-PIC-NEXT: .L[[VAR4:.*]] = .LBB{{.*}}-.LJTI0_0
|
; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0
|
||||||
; CHECK-PIC-NEXT: .L[[VAR5:.*]] = .LBB{{.*}}-.LJTI0_0
|
; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0
|
||||||
; CHECK-PIC-NEXT: .LJTI0_0:
|
; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0
|
||||||
; CHECK-PIC-NEXT: .word .L[[VAR1]]
|
; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0
|
||||||
; 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: .end_data_region
|
; CHECK-PIC-NOT: .end_data_region
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
; RUN: llc -mtriple=x86_64-pc-linux -O2 -regalloc=basic < %s | FileCheck %s
|
; 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.
|
; Test to check .debug_loc support. This test case emits many debug_loc entries.
|
||||||
|
|
||||||
; CHECK: Loc expr size
|
; CHECK: .short {{.*}} # Loc expr size
|
||||||
; CHECK-NEXT: .short
|
|
||||||
; CHECK-NEXT: .Ltmp
|
; CHECK-NEXT: .Ltmp
|
||||||
; CHECK-NEXT: DW_OP_reg
|
; CHECK-NEXT: DW_OP_reg
|
||||||
|
|
||||||
|
@ -38,10 +38,8 @@ threw:
|
|||||||
; CHECK-NEXT: .byte 3
|
; CHECK-NEXT: .byte 3
|
||||||
; CHECK-NEXT: .byte 13
|
; CHECK-NEXT: .byte 13
|
||||||
; Verify that the unwind data covers the entire patchpoint region:
|
; Verify that the unwind data covers the entire patchpoint region:
|
||||||
; CHECK-NEXT: [[RANGE_OFFSET:.L[^ ]*]] = .Ltmp0-[[FUNC_BEGIN]]
|
; CHECK-NEXT: .long .Ltmp0-[[FUNC_BEGIN]]
|
||||||
; CHECK-NEXT: .long [[RANGE_OFFSET]]
|
; CHECK-NEXT: .long [[PP_END]]-.Ltmp0
|
||||||
; CHECK-NEXT: [[RANGE_LENGTH:.L[^ ]*]] = [[PP_END]]-.Ltmp0
|
|
||||||
; CHECK-NEXT: .long [[RANGE_LENGTH]]
|
|
||||||
|
|
||||||
|
|
||||||
; Verify that the stackmap section got emitted:
|
; Verify that the stackmap section got emitted:
|
||||||
|
@ -107,17 +107,12 @@ Exit:
|
|||||||
; CHECK: .asciiz
|
; CHECK: .asciiz
|
||||||
; CHECK: .byte 3
|
; CHECK: .byte 3
|
||||||
; CHECK: .byte 26
|
; CHECK: .byte 26
|
||||||
; CHECK: [[SET0:.L[a-zA-Z0-9_]+]] = [[PRE_G]]-[[START]]
|
; CHECK: .long [[PRE_G]]-[[START]]
|
||||||
; CHECK: .long [[SET0]]
|
; CHECK: .long [[POST_G]]-[[PRE_G]]
|
||||||
; CHECK: [[SET1:.L[a-zA-Z0-9_]+]] = [[POST_G]]-[[PRE_G]]
|
; CHECK: .long [[LANDING]]-[[START]]
|
||||||
; CHECK: .long [[SET1]]
|
|
||||||
; CHECK: [[SET2:.L[a-zA-Z0-9_]+]] = [[LANDING]]-[[START]]
|
|
||||||
; CHECK: .long [[SET2]]
|
|
||||||
; CHECK: .byte 3
|
; CHECK: .byte 3
|
||||||
; CHECK: [[SET3:.L[a-zA-Z0-9_]+]] = [[POST_G]]-[[START]]
|
; CHECK: .long [[POST_G]]-[[START]]
|
||||||
; CHECK: .long [[SET3]]
|
; CHECK: .long [[END]]-[[POST_G]]
|
||||||
; CHECK: [[SET4:.L[a-zA-Z0-9_]+]] = [[END]]-[[POST_G]]
|
|
||||||
; CHECK: .long [[SET4]]
|
|
||||||
; CHECK: .long 0
|
; CHECK: .long 0
|
||||||
; CHECK: .byte 0
|
; CHECK: .byte 0
|
||||||
; CHECK: .byte 1
|
; CHECK: .byte 1
|
||||||
|
@ -22,17 +22,13 @@
|
|||||||
; We expect two location ranges for the variable.
|
; We expect two location ranges for the variable.
|
||||||
|
|
||||||
; First, it is stored in %rdx:
|
; First, it is stored in %rdx:
|
||||||
; CHECK: .Lset{{[0-9]+}} = .Lfunc_begin0-.Lfunc_begin0
|
; CHECK: .quad .Lfunc_begin0-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
; CHECK-NEXT: .quad [[START_LABEL]]-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0
|
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
|
||||||
; CHECK: DW_OP_reg5
|
; CHECK: DW_OP_reg5
|
||||||
|
|
||||||
; Then it's addressed via %rsp:
|
; Then it's addressed via %rsp:
|
||||||
; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0
|
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
; CHECK-NEXT: .Lfunc_end0-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0
|
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
|
||||||
; CHECK: DW_OP_breg7
|
; CHECK: DW_OP_breg7
|
||||||
; CHECK-NEXT: [[OFFSET]]
|
; CHECK-NEXT: [[OFFSET]]
|
||||||
; CHECK: DW_OP_deref
|
; CHECK: DW_OP_deref
|
||||||
|
@ -15,18 +15,15 @@
|
|||||||
|
|
||||||
; <data section> - it should have made one span covering all vars in this CU.
|
; <data section> - it should have made one span covering all vars in this CU.
|
||||||
; CHECK-NEXT: .quad some_data
|
; CHECK-NEXT: .quad some_data
|
||||||
; CHECK-NEXT: [[R1:\.[A-Za-z0-9]*]] = .Ldebug_end1-some_data
|
; CHECK-NEXT: .quad .Ldebug_end1-some_data
|
||||||
; CHECK-NEXT: .quad [[R1]]
|
|
||||||
|
|
||||||
; <text section> - it should have made one span covering all functions in this CU.
|
; <text section> - it should have made one span covering all functions in this CU.
|
||||||
; CHECK-NEXT: .quad .Lfunc_begin0
|
; CHECK-NEXT: .quad .Lfunc_begin0
|
||||||
; CHECK-NEXT: [[R2:\.[A-Za-z0-9]*]] = .Ldebug_end2-.Lfunc_begin0
|
; CHECK-NEXT: .quad .Ldebug_end2-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .quad [[R2]]
|
|
||||||
|
|
||||||
; <other sections> - it should have made one span covering all vars in this CU.
|
; <other sections> - it should have made one span covering all vars in this CU.
|
||||||
; CHECK-NEXT: .quad some_other
|
; CHECK-NEXT: .quad some_other
|
||||||
; CHECK-NEXT: [[R3:\.[A-Za-z0-9]*]] = .Ldebug_end3-some_other
|
; CHECK-NEXT: .quad .Ldebug_end3-some_other
|
||||||
; CHECK-NEXT: .quad [[R3]]
|
|
||||||
|
|
||||||
; -- finish --
|
; -- finish --
|
||||||
; CHECK-NEXT: # ARange terminator
|
; CHECK-NEXT: # ARange terminator
|
||||||
|
@ -8,8 +8,7 @@
|
|||||||
; CHECK-NEXT: .byte 0 # Segment Size (in bytes)
|
; CHECK-NEXT: .byte 0 # Segment Size (in bytes)
|
||||||
; CHECK-NEXT: .zero 4,255
|
; CHECK-NEXT: .zero 4,255
|
||||||
; CHECK-NEXT: .quad kittens
|
; CHECK-NEXT: .quad kittens
|
||||||
; CHECK-NEXT: .Lset0 = rainbows-kittens
|
; CHECK-NEXT: .quad rainbows-kittens
|
||||||
; CHECK-NEXT: .quad .Lset0
|
|
||||||
; CHECK-NEXT: .quad 0 # ARange terminator
|
; CHECK-NEXT: .quad 0 # ARange terminator
|
||||||
; CHECK-NEXT: .quad 0
|
; CHECK-NEXT: .quad 0
|
||||||
|
|
||||||
@ -21,8 +20,7 @@
|
|||||||
; CHECK-NEXT: .byte 0 # Segment Size (in bytes)
|
; CHECK-NEXT: .byte 0 # Segment Size (in bytes)
|
||||||
; CHECK-NEXT: .zero 4,255
|
; CHECK-NEXT: .zero 4,255
|
||||||
; CHECK-NEXT: .quad rainbows
|
; CHECK-NEXT: .quad rainbows
|
||||||
; CHECK-NEXT: .Lset1 = .Ldebug_end0-rainbows
|
; CHECK-NEXT: .quad .Ldebug_end0-rainbows
|
||||||
; CHECK-NEXT: .quad .Lset1
|
|
||||||
; CHECK-NEXT: .quad 0 # ARange terminator
|
; CHECK-NEXT: .quad 0 # ARange terminator
|
||||||
; CHECK-NEXT: .quad 0
|
; CHECK-NEXT: .quad 0
|
||||||
|
|
||||||
|
@ -20,10 +20,8 @@
|
|||||||
; Verify that we have proper range in debug_loc section:
|
; Verify that we have proper range in debug_loc section:
|
||||||
; CHECK: .Ldebug_loc{{[0-9]+}}:
|
; CHECK: .Ldebug_loc{{[0-9]+}}:
|
||||||
; CHECK: DW_OP_breg1
|
; CHECK: DW_OP_breg1
|
||||||
; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0
|
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
; CHECK-NEXT: .quad .Lfunc_end0-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0
|
|
||||||
; CHECK-NEXT: .quad .Lset{{[0-9]+}}
|
|
||||||
; CHECK: DW_OP_breg6
|
; CHECK: DW_OP_breg6
|
||||||
; CHECK: DW_OP_deref
|
; CHECK: DW_OP_deref
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user