diff options
author | Alexei Starovoitov <alexei.starovoitov@gmail.com> | 2015-07-24 03:17:08 +0000 |
---|---|---|
committer | Alexei Starovoitov <alexei.starovoitov@gmail.com> | 2015-07-24 03:17:08 +0000 |
commit | 01886a05b896f161779c8ea47b5aa20d0f6de7fe (patch) | |
tree | 91ffc27d701209a6e87f55fc7535f36e0f5a3257 /llvm/lib/Target/BPF | |
parent | cd1b6dbcad2a6c52e32d3259da96f9567c7bd81d (diff) | |
download | bcm5719-llvm-01886a05b896f161779c8ea47b5aa20d0f6de7fe.tar.gz bcm5719-llvm-01886a05b896f161779c8ea47b5aa20d0f6de7fe.zip |
[bpf] initial support for debug_info
llvm-svn: 243087
Diffstat (limited to 'llvm/lib/Target/BPF')
-rw-r--r-- | llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h | 2 |
3 files changed, 22 insertions, 9 deletions
diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp b/llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp index 36f99262ed7..8c358cab62e 100644 --- a/llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp +++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp @@ -68,16 +68,23 @@ void BPFAsmBackend::applyFixup(const MCFixup &Fixup, char *Data, if (Fixup.getKind() == FK_SecRel_4 || Fixup.getKind() == FK_SecRel_8) { assert(Value == 0); - return; - } - assert(Fixup.getKind() == FK_PCRel_2); - Value = (uint16_t)((Value - 8) / 8); - if (IsLittleEndian) { - Data[Fixup.getOffset() + 2] = Value & 0xFF; - Data[Fixup.getOffset() + 3] = Value >> 8; + } else if (Fixup.getKind() == FK_Data_4 || Fixup.getKind() == FK_Data_8) { + unsigned Size = Fixup.getKind() == FK_Data_4 ? 4 : 8; + + for (unsigned i = 0; i != Size; ++i) { + unsigned Idx = IsLittleEndian ? i : Size - i; + Data[Fixup.getOffset() + Idx] = uint8_t(Value >> (i * 8)); + } } else { - Data[Fixup.getOffset() + 2] = Value >> 8; - Data[Fixup.getOffset() + 3] = Value & 0xFF; + assert(Fixup.getKind() == FK_PCRel_2); + Value = (uint16_t)((Value - 8) / 8); + if (IsLittleEndian) { + Data[Fixup.getOffset() + 2] = Value & 0xFF; + Data[Fixup.getOffset() + 3] = Value >> 8; + } else { + Data[Fixup.getOffset() + 2] = Value >> 8; + Data[Fixup.getOffset() + 3] = Value & 0xFF; + } } } diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp b/llvm/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp index 05ba6183e32..87cdd5eb9da 100644 --- a/llvm/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp +++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp @@ -44,6 +44,10 @@ unsigned BPFELFObjectWriter::GetRelocType(const MCValue &Target, return ELF::R_X86_64_64; case FK_SecRel_4: return ELF::R_X86_64_PC32; + case FK_Data_8: + return IsPCRel ? ELF::R_X86_64_PC64 : ELF::R_X86_64_64; + case FK_Data_4: + return IsPCRel ? ELF::R_X86_64_PC32 : ELF::R_X86_64_32; } } diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h index d63bbf49294..1f440fe8787 100644 --- a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h +++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h @@ -34,6 +34,8 @@ public: UsesELFSectionDirectiveForBSS = true; HasSingleParameterDotFile = false; HasDotTypeDotSizeDirective = false; + + SupportsDebugInformation = true; } }; } |