mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
MCAssembler: Move ApplyFixup to the TargetAsmBackend, this is a target specific not object writer specific task.
llvm-svn: 98947
This commit is contained in:
parent
b2aafb5fe9
commit
3444d755d2
@ -10,7 +10,11 @@
|
||||
#ifndef LLVM_TARGET_TARGETASMBACKEND_H
|
||||
#define LLVM_TARGET_TARGETASMBACKEND_H
|
||||
|
||||
#include "llvm/System/DataTypes.h"
|
||||
|
||||
namespace llvm {
|
||||
class MCAsmFixup;
|
||||
class MCDataFragment;
|
||||
class MCSection;
|
||||
class Target;
|
||||
|
||||
@ -75,6 +79,12 @@ public:
|
||||
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
|
||||
/// data fragment, at the offset specified by the fixup and following the
|
||||
/// fixup kind as appropriate.
|
||||
virtual void ApplyFixup(const MCAsmFixup &Fixup, MCDataFragment &Fragment,
|
||||
uint64_t Value) const = 0;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -930,17 +930,6 @@ public:
|
||||
OS << StringTable.str();
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyFixup(const MCAsmFixup &Fixup, MCDataFragment &DF,
|
||||
uint64_t FixedValue) {
|
||||
unsigned Size = 1 << getFixupKindLog2Size(Fixup.Kind);
|
||||
|
||||
// FIXME: Endianness assumption.
|
||||
assert(Fixup.Offset + Size <= DF.getContents().size() &&
|
||||
"Invalid fixup offset!");
|
||||
for (unsigned i = 0; i != Size; ++i)
|
||||
DF.getContents()[Fixup.Offset + i] = uint8_t(FixedValue >> (i * 8));
|
||||
}
|
||||
};
|
||||
|
||||
/* *** */
|
||||
@ -1475,7 +1464,7 @@ void MCAssembler::Finish() {
|
||||
MOW.RecordRelocation(*this, *DF, Fixup, Target, FixedValue);
|
||||
}
|
||||
|
||||
MOW.ApplyFixup(Fixup, *DF, FixedValue);
|
||||
getBackend().ApplyFixup(Fixup, *DF, FixedValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,8 @@
|
||||
|
||||
#include "llvm/Target/TargetAsmBackend.h"
|
||||
#include "X86.h"
|
||||
#include "X86FixupKinds.h"
|
||||
#include "llvm/MC/MCAssembler.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/Target/TargetRegistry.h"
|
||||
#include "llvm/Target/TargetAsmBackend.h"
|
||||
@ -16,10 +18,34 @@ using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
static unsigned getFixupKindLog2Size(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
default: assert(0 && "invalid fixup kind!");
|
||||
case X86::reloc_pcrel_1byte:
|
||||
case FK_Data_1: return 0;
|
||||
case FK_Data_2: return 1;
|
||||
case X86::reloc_pcrel_4byte:
|
||||
case X86::reloc_riprel_4byte:
|
||||
case X86::reloc_riprel_4byte_movq_load:
|
||||
case FK_Data_4: return 2;
|
||||
case FK_Data_8: return 3;
|
||||
}
|
||||
}
|
||||
|
||||
class X86AsmBackend : public TargetAsmBackend {
|
||||
public:
|
||||
X86AsmBackend(const Target &T)
|
||||
: TargetAsmBackend(T) {}
|
||||
|
||||
void ApplyFixup(const MCAsmFixup &Fixup, MCDataFragment &DF,
|
||||
uint64_t Value) const {
|
||||
unsigned Size = 1 << getFixupKindLog2Size(Fixup.Kind);
|
||||
|
||||
assert(Fixup.Offset + Size <= DF.getContents().size() &&
|
||||
"Invalid fixup offset!");
|
||||
for (unsigned i = 0; i != Size; ++i)
|
||||
DF.getContents()[Fixup.Offset + i] = uint8_t(Value >> (i * 8));
|
||||
}
|
||||
};
|
||||
|
||||
class DarwinX86AsmBackend : public X86AsmBackend {
|
||||
|
Loading…
Reference in New Issue
Block a user