mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
MCAssembler: Fix pcrel relocations. Oh and,
-- ddunbar@ozzy:tmp$ clang -m32 -integrated-as hello.c && ./a.out hello world! -- llvm-svn: 96096
This commit is contained in:
parent
c05a38a3d3
commit
e6679afaa7
@ -64,6 +64,17 @@ static unsigned getFixupKindLog2Size(MCFixupKind Kind) {
|
||||
}
|
||||
}
|
||||
|
||||
static bool isFixupKindPCRel(MCFixupKind Kind) {
|
||||
switch (Kind) {
|
||||
default:
|
||||
return false;
|
||||
case X86::reloc_pcrel_1byte:
|
||||
case X86::reloc_pcrel_4byte:
|
||||
case X86::reloc_riprel_4byte:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class MachObjectWriter {
|
||||
// See <mach-o/loader.h>.
|
||||
enum {
|
||||
@ -447,6 +458,10 @@ public:
|
||||
|
||||
// The value which goes in the fixup is current value of the expression.
|
||||
Fixup.FixedValue = Value - Value2 + Target.getConstant();
|
||||
if (isFixupKindPCRel(Fixup.Kind)) {
|
||||
Fixup.FixedValue -= Address + (1 << Log2Size);
|
||||
IsPCRel = 1;
|
||||
}
|
||||
|
||||
MachRelocationEntry MRE;
|
||||
MRE.Word0 = ((Address << 0) |
|
||||
@ -515,10 +530,11 @@ public:
|
||||
//
|
||||
// FIXME: O(N)
|
||||
Index = 1;
|
||||
for (MCAssembler::iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it, ++Index)
|
||||
MCAssembler::iterator it = Asm.begin(), ie = Asm.end();
|
||||
for (; it != ie; ++it, ++Index)
|
||||
if (&*it == SD->getFragment()->getParent())
|
||||
break;
|
||||
assert(it != ie && "Unable to find section index!");
|
||||
Value = SD->getFragment()->getAddress() + SD->getOffset();
|
||||
}
|
||||
|
||||
@ -530,6 +546,11 @@ public:
|
||||
|
||||
unsigned Log2Size = getFixupKindLog2Size(Fixup.Kind);
|
||||
|
||||
if (isFixupKindPCRel(Fixup.Kind)) {
|
||||
Fixup.FixedValue -= Address + (1<<Log2Size);
|
||||
IsPCRel = 1;
|
||||
}
|
||||
|
||||
// struct relocation_info (8 bytes)
|
||||
MachRelocationEntry MRE;
|
||||
MRE.Word0 = Address;
|
||||
|
Loading…
Reference in New Issue
Block a user