[PATCH] D33673: [Object/RelocVisitor] - Add support for R_X86_64_DTPOFF32 relocation.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 30 05:27:53 PDT 2017
grimar created this revision.
Herald added a subscriber: aprantl.
This is PR33173. More simple way to reproduce is below:
If we have tls.c file with line
__thread int a;
gcc -c tls.c -g
gives us R_X86_64_DTPOFF32 relocation in output:
Relocation section '.rela.debug_info' at offset 0x2e0 contains 6 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000006 00070000000a R_X86_64_32 0000000000000000 .debug_abbrev + 0
00000000000c 000a0000000a R_X86_64_32 0000000000000000 .debug_str + 26
000000000011 000a0000000a R_X86_64_32 0000000000000000 .debug_str + 54
000000000015 000a0000000a R_X86_64_32 0000000000000000 .debug_str + 0
000000000019 00090000000a R_X86_64_32 0000000000000000 .debug_line + 0
000000000028 000d00000015 R_X86_64_DTPOFF32 0000000000000000 a + 0
And run of llvm-dwarfdump tls.o would report "error: failed to compute relocation: R_X86_64_DTPOFF32"
error then, because such a relocation is not supported atm.
R_X86_64_DTPOFF32 calculates negative offset in the TLS block. Problem that size of TLS segment is not known
here. The same applies for PR33173 where we use RelocVisitor as part of DWARFContextInMemory for building .gdb_index.
TLS relocations pointing to .debug_info seems useless for index building purposes and we do not care about final value too.
So far it seems reasonable to have some value by default for TLS size, like 0 in this patch and some API that can be used in theory
if somebody needs to evaluate those TLS relocations.
That is what this patch do.
https://reviews.llvm.org/D33673
Files:
include/llvm/DebugInfo/DIContext.h
include/llvm/Object/RelocVisitor.h
lib/DebugInfo/DWARF/DWARFContext.cpp
Index: lib/DebugInfo/DWARF/DWARFContext.cpp
===================================================================
--- lib/DebugInfo/DWARF/DWARFContext.cpp
+++ lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -1173,7 +1173,7 @@
continue;
}
- object::RelocVisitor V(Obj);
+ object::RelocVisitor V(Obj, L ? L->getTlsSize() : 0);
uint64_t Val = V.visit(Reloc.getType(), Reloc, SymInfoOrErr->Address);
if (V.error()) {
SmallString<32> Name;
Index: include/llvm/Object/RelocVisitor.h
===================================================================
--- include/llvm/Object/RelocVisitor.h
+++ include/llvm/Object/RelocVisitor.h
@@ -35,7 +35,8 @@
/// @brief Base class for object file relocation visitors.
class RelocVisitor {
public:
- explicit RelocVisitor(const ObjectFile &Obj) : ObjToVisit(Obj) {}
+ explicit RelocVisitor(const ObjectFile &Obj, uint64_t TlsSize)
+ : ObjToVisit(Obj), TlsSize(TlsSize) {}
// TODO: Should handle multiple applied relocations via either passing in the
// previously computed value or just count paired relocations as a single
@@ -56,6 +57,7 @@
private:
const ObjectFile &ObjToVisit;
+ uint64_t TlsSize;
bool HasError = false;
uint64_t visitELF(uint32_t Rel, RelocationRef R, uint64_t Value) {
@@ -132,6 +134,8 @@
case ELF::R_X86_64_32:
case ELF::R_X86_64_32S:
return (Value + getELFAddend(R)) & 0xFFFFFFFF;
+ case ELF::R_X86_64_DTPOFF32:
+ return Value + getELFAddend(R) - TlsSize;
}
HasError = true;
return 0;
Index: include/llvm/DebugInfo/DIContext.h
===================================================================
--- include/llvm/DebugInfo/DIContext.h
+++ include/llvm/DebugInfo/DIContext.h
@@ -211,6 +211,10 @@
return false;
}
+ /// Method returns size of TLS segment which is required for resolving TLS
+ /// relocations sometimes.
+ virtual uint64_t getTlsSize() const { return 0; }
+
/// Obtain a copy of this LoadedObjectInfo.
///
/// The caller is responsible for deallocation once the copy is no longer required.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33673.100692.patch
Type: text/x-patch
Size: 2093 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170530/9c4d83c3/attachment.bin>
More information about the llvm-commits
mailing list