Do not recurse into symbol refs that have a variant kind. This prevents us

from losing the variant when producing a relocation on an alias.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117037 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2010-10-21 18:00:20 +00:00
parent 0b9325c97d
commit 8c8bc05a38
2 changed files with 17 additions and 1 deletions

View File

@ -306,7 +306,7 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCSymbol &Sym = SRE->getSymbol();
// Evaluate recursively if this is a variable.
if (Sym.isVariable())
if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None)
return Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Layout,
true);

16
test/MC/ELF/alias-reloc.s Normal file
View File

@ -0,0 +1,16 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
// Test that this produces a R_X86_64_PLT32. We produce a relocation with foo
// and gas with bar, but both should be OK as long as the type is correct.
.globl foo
foo:
bar = foo
call bar@PLT
// CHECK: # Relocation 0
// CHECK-NEXT: (('r_offset',
// CHECK-NEXT: ('r_sym',
// CHECK-NEXT: ('r_type', 0x00000004)
// CHECK-NEXT: ('r_addend',
// CHECK-NEXT: ),
// CHECK-NEXT: ])