mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
Next step: Only pad debug_line when the target is darwin. Add a FIXME to avoid
doing that if the target is darwin10 or newer. This fixes *) Direct object emission was producing objects without the workaround on darwin9. *) Assembly printing was producing objects with the workaround on linux. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120866 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ceab50198e
commit
767b1be390
@ -51,6 +51,11 @@ namespace llvm {
|
||||
/// emitted in Static relocation model.
|
||||
bool HasStaticCtorDtorReferenceInStaticMode; // Default is false.
|
||||
|
||||
/// LinkerRequiresNonEmptyDwarfLines - True if the linker has a bug and
|
||||
/// requires that the debug_line section be of a minimum size. In practice
|
||||
/// such a linker requires a non empty line sequence if a file is present.
|
||||
bool LinkerRequiresNonEmptyDwarfLines; // Default to false.
|
||||
|
||||
/// MaxInstLength - This is the maximum possible length of an instruction,
|
||||
/// which is needed to compute the size of an inline asm.
|
||||
unsigned MaxInstLength; // Defaults to 4.
|
||||
@ -322,6 +327,9 @@ namespace llvm {
|
||||
bool hasStaticCtorDtorReferenceInStaticMode() const {
|
||||
return HasStaticCtorDtorReferenceInStaticMode;
|
||||
}
|
||||
bool getLinkerRequiresNonEmptyDwarfLines() const {
|
||||
return LinkerRequiresNonEmptyDwarfLines;
|
||||
}
|
||||
unsigned getMaxInstLength() const {
|
||||
return MaxInstLength;
|
||||
}
|
||||
|
@ -208,8 +208,7 @@ namespace llvm {
|
||||
//
|
||||
// This emits the Dwarf file and the line tables.
|
||||
//
|
||||
static void Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection,
|
||||
const MCSection *TextSection = NULL);
|
||||
static void Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection);
|
||||
};
|
||||
|
||||
class MCDwarfLineAddr {
|
||||
|
@ -23,6 +23,7 @@ MCAsmInfo::MCAsmInfo() {
|
||||
HasMachoZeroFillDirective = false;
|
||||
HasMachoTBSSDirective = false;
|
||||
HasStaticCtorDtorReferenceInStaticMode = false;
|
||||
LinkerRequiresNonEmptyDwarfLines = false;
|
||||
MaxInstLength = 4;
|
||||
PCSymbol = "$";
|
||||
SeparatorChar = ';';
|
||||
|
@ -37,6 +37,9 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
|
||||
HasMachoZeroFillDirective = true; // Uses .zerofill
|
||||
HasMachoTBSSDirective = true; // Uses .tbss
|
||||
HasStaticCtorDtorReferenceInStaticMode = true;
|
||||
|
||||
// FIXME: Darwin 10 and newer don't need this.
|
||||
LinkerRequiresNonEmptyDwarfLines = true;
|
||||
|
||||
HiddenVisibilityAttr = MCSA_PrivateExtern;
|
||||
// Doesn't support protected visibility.
|
||||
|
@ -896,8 +896,7 @@ void MCAsmStreamer::EmitRawText(StringRef String) {
|
||||
void MCAsmStreamer::Finish() {
|
||||
// Dump out the dwarf file & directory tables and line tables.
|
||||
if (getContext().hasDwarfFiles() && TLOF)
|
||||
MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection(),
|
||||
TLOF->getTextSection());
|
||||
MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection());
|
||||
}
|
||||
|
||||
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
|
||||
|
@ -7,6 +7,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCDwarf.h"
|
||||
#include "llvm/MC/MCAssembler.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
@ -198,8 +199,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
||||
// This emits the Dwarf file and the line tables.
|
||||
//
|
||||
void MCDwarfFileTable::Emit(MCStreamer *MCOS,
|
||||
const MCSection *DwarfLineSection,
|
||||
const MCSection *TextSection) {
|
||||
const MCSection *DwarfLineSection) {
|
||||
// Switch to the section where the table will be emitted into.
|
||||
MCOS->SwitchSection(DwarfLineSection);
|
||||
|
||||
@ -296,7 +296,8 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS,
|
||||
delete Line;
|
||||
}
|
||||
|
||||
if (TextSection && MCLineSectionOrder.begin() == MCLineSectionOrder.end()) {
|
||||
if (MCOS->getContext().getAsmInfo().getLinkerRequiresNonEmptyDwarfLines()
|
||||
&& MCLineSectionOrder.begin() == MCLineSectionOrder.end()) {
|
||||
// The darwin9 linker has a bug (see PR8715). For for 32-bit architectures
|
||||
// it requires:
|
||||
// total_length >= prologue_length + 10
|
||||
|
21
test/MC/ELF/empty-dwarf-lines.s
Normal file
21
test/MC/ELF/empty-dwarf-lines.s
Normal file
@ -0,0 +1,21 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
|
||||
|
||||
// Test that the dwarf debug_line section contains no line directives.
|
||||
|
||||
.file 1 "test.c"
|
||||
.globl c
|
||||
c:
|
||||
.asciz "hi\n"
|
||||
|
||||
// CHECK: # Section 0x00000004
|
||||
// CHECK-NEXT: (('sh_name', 0x00000012) # '.debug_line'
|
||||
// CHECK-NEXT: ('sh_type', 0x00000000)
|
||||
// CHECK-NEXT: ('sh_flags', 0x00000000)
|
||||
// CHECK-NEXT: ('sh_addr', 0x00000000)
|
||||
// CHECK-NEXT: ('sh_offset', 0x00000044)
|
||||
// CHECK-NEXT: ('sh_size', 0x00000027)
|
||||
// CHECK-NEXT: ('sh_link', 0x00000000)
|
||||
// CHECK-NEXT: ('sh_info', 0x00000000)
|
||||
// CHECK-NEXT: ('sh_addralign', 0x00000001)
|
||||
// CHECK-NEXT: ('sh_entsize', 0x00000000)
|
||||
// CHECK-NEXT: ),
|
25
test/MC/MachO/empty-dwarf-lines.s
Normal file
25
test/MC/MachO/empty-dwarf-lines.s
Normal file
@ -0,0 +1,25 @@
|
||||
// RUN: llvm-mc -triple x86_64-apple-darwin9 %s -filetype=obj -o - | macho-dump | FileCheck %s
|
||||
|
||||
// This tests that when producing files for darwin9 or older we make sure
|
||||
// that debug_line sections are of a minimum size to avoid the linker bug
|
||||
// described in PR8715.
|
||||
|
||||
.section __DATA,__data
|
||||
.file 1 "test.c"
|
||||
.globl _c ## @c
|
||||
_c:
|
||||
.asciz "hi\n"
|
||||
|
||||
// CHECK: (('section_name', '__debug_line\x00\x00\x00\x00')
|
||||
// CHECK-NEXT: ('segment_name', '__DWARF\x00\x00\x00\x00\x00\x00\x00\x00\x00')
|
||||
// CHECK-NEXT: ('address', 4)
|
||||
// CHECK-NEXT: ('size', 44)
|
||||
// CHECK-NEXT: ('offset', 452)
|
||||
// CHECK-NEXT: ('alignment', 0)
|
||||
// CHECK-NEXT: ('reloc_offset', 496)
|
||||
// CHECK-NEXT: ('num_reloc', 4)
|
||||
// CHECK-NEXT: ('flags', 0x2000000)
|
||||
// CHECK-NEXT: ('reserved1', 0)
|
||||
// CHECK-NEXT: ('reserved2', 0)
|
||||
// CHECK-NEXT: ('reserved3', 0)
|
||||
// CHECK-NEXT: ),
|
Loading…
Reference in New Issue
Block a user