diff options
author | Kevin Enderby <enderby@apple.com> | 2010-10-02 00:13:41 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2010-10-02 00:13:41 +0000 |
commit | 8c9aa922a94bd788ea061be7555fb5b1db3a5312 (patch) | |
tree | e323514b13a8df4681c7fd24b05b77bc44da23e3 /lib/MC/MCMachOStreamer.cpp | |
parent | 5f2d1fa0f7c484f319d20e7f1c04f110a4b86648 (diff) |
This adds a Darwin x86_64 relocation encoding for a subtraction expression
where both symbols are "local", that is non-external symbols, and there is
no "base" for the symbols used in the expression, that is the section has
no non-temporary symbols. This case looks like this:
% cat local_reloc_A-B.s
.long 0
LB: .long 1
.long LA - LB - 4
.long 2
LA: .long 3
which llvm-mc will not encode without this patch, generates a "unsupported
local relocations in difference" error, but the Darwin assembler will
encode with relocation entries like this:
% otool -rv a.out l.out
a.out:
Relocation information (__TEXT,__text) 2 entries
address pcrel length extern type scattered symbolnum/value
00000008 False long False SUB False 1 (__TEXT,__text)
00000008 False long False UNSIGND False 1 (__TEXT,__text)
which is very similar to what is encoded when the symbols don't have the
leading 'L' and they are not temporary symbols. Which llvm-mc and the
Darwin assembler will encoded like this:
Relocation information (__TEXT,__text) 2 entries
address pcrel length extern type scattered symbolnum/value
00000008 False long True SUB False B
00000008 False long True UNSIGND False A
This is the missing relocation encoding needed to allow the Mach-O x86
Dwarf file and line table to be emitted. So this patch also removes the
TODO from the if() statement in MCMachOStreamer::Finish() that didn't
call MCDwarfFileTable::Emit() for 64-bit targets.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115389 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCMachOStreamer.cpp')
-rw-r--r-- | lib/MC/MCMachOStreamer.cpp | 10 |
1 files changed, 1 insertions, 9 deletions
diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index 42de0ae1b5..a10a63ee6a 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -441,15 +441,7 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) { void MCMachOStreamer::Finish() { // Dump out the dwarf file & directory tables and line tables. - if (getContext().hasDwarfFiles() && - // TODO: This not enabled for 64-bit Mach-O targets. As there are needed - // changes in the handling of 64-bit relocation entries for dwarf Mach-O - // sections that need to made. Currently it gets - // LLVM ERROR: unsupported local relocations in difference - // due dealing with "a-b" expressions made up for dwarf line entries - // because the line section has no non-local symbols thus it can't find - // an atom symbol for the base. - getAssembler().getBackend().getPointerSize() != 8) { + if (getContext().hasDwarfFiles()) { const MCSection *DwarfLineSection = getContext().getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, |