Skip to content
Snippets Groups Projects
Commit 1ec49110 authored by George Rimar's avatar George Rimar
Browse files

[llvm-dwarfdump] - Do not error out on R_X86_64_DTPOFF64/R_X86_64_DTPOFF32 relocations.

This is https://bugs.llvm.org/show_bug.cgi?id=39992,

If we have the following code (test.cpp):

thread_local int tdata = 24;
and build an .o file with debug information:

clang --target=x86_64-pc-linux -c bar.cpp -g

Then object produced may have R_X86_64_DTPOFF64/R_X86_64_DTPOFF32 relocations.
(clang emits R_X86_64_DTPOFF64 and gcc emits R_X86_64_DTPOFF32 for the code above for me)

Currently, llvm-dwarfdump fails to compute this TLS relocation when dumping
object and reports an
error:
failed to compute relocation: R_X86_64_DTPOFF64, Invalid data was encountered while parsing the file

This relocation represents the offset in the TLS block and resolved by the linker,
but this info is unavailable at the
point when the object file is dumped by this tool.

The patch adds the simple evaluation for such relocations to avoid emitting errors.
Resulting behavior seems to be equal to GNU dwarfdump.

Differential revision: https://reviews.llvm.org/D55762

llvm-svn: 349476
parent 150fd430
No related branches found
No related tags found
No related merge requests found
...@@ -129,6 +129,8 @@ private: ...@@ -129,6 +129,8 @@ private:
case ELF::R_X86_64_NONE: case ELF::R_X86_64_NONE:
return 0; return 0;
case ELF::R_X86_64_64: case ELF::R_X86_64_64:
case ELF::R_X86_64_DTPOFF32:
case ELF::R_X86_64_DTPOFF64:
return Value + getELFAddend(R); return Value + getELFAddend(R);
case ELF::R_X86_64_PC32: case ELF::R_X86_64_PC32:
return Value + getELFAddend(R) - R.getOffset(); return Value + getELFAddend(R) - R.getOffset();
......
# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o
# RUN: llvm-dwarfdump -v %t.o | FileCheck %s
# CHECK-NOT: error
# CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_const8u 0x0, DW_OP_GNU_push_tls_address)
# CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_const4u 0x0, DW_OP_GNU_push_tls_address)
.section .debug_str,"MS",@progbits,1
.Linfo_string0:
.asciz "X"
.section .debug_abbrev,"",@progbits
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 1 # DW_CHILDREN_yes
.byte 37 # DW_AT_producer
.byte 14 # DW_FORM_strp
.byte 19 # DW_AT_language
.byte 5 # DW_FORM_data2
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 2 # Abbreviation Code
.byte 52 # DW_TAG_variable
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 63 # DW_AT_external
.byte 25 # DW_FORM_flag_present
.byte 2 # DW_AT_location
.byte 24 # DW_FORM_exprloc
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 0 # EOM(3)
.section .debug_info,"",@progbits
.long 49 # Length of Unit
.short 4 # DWARF version number
.long .debug_abbrev # Offset Into Abbrev. Section
.byte 8 # Address Size (in bytes)
.byte 1 # Abbrev [1] 0xb:0x6c DW_TAG_compile_unit
.long .Linfo_string0 # DW_AT_producer
.short 4 # DW_AT_language
.long .Linfo_string0 # DW_AT_name
.byte 2 # Abbrev [2] 0x2a:0x16 DW_TAG_variable
.long .Linfo_string0 # DW_AT_name
.long 0 # DW_AT_type
.byte 10 # DW_AT_location
.byte 14
.quad tdata1@DTPOFF
.byte 224
.byte 2 # Abbrev [2] 0x47:0x16 DW_TAG_variable
.long .Linfo_string0 # DW_AT_name
.long 0 # DW_AT_type
.byte 6 # DW_AT_location
.byte 12
.long tdata2@DTPOFF
.byte 224
.byte 0 # End Of Children Mark
.byte 0 # End Of Children Mark
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment