mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 19:29:53 +00:00
Add handling for FK_SecRel_4 (4-byte section relative relocations). These are used by the generation of DWARF debug information (the abbrevations use section relative relocations). This will also be used in generation of CodeView line tables. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207941 91177308-0d34-0410-b5e6-96231b3b80d8
77 lines
2.6 KiB
C++
77 lines
2.6 KiB
C++
//===-- ARMWinCOFFObjectWriter.cpp - ARM Windows COFF Object Writer -- C++ -==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "MCTargetDesc/ARMFixupKinds.h"
|
|
#include "llvm/MC/MCFixup.h"
|
|
#include "llvm/MC/MCValue.h"
|
|
#include "llvm/MC/MCWinCOFFObjectWriter.h"
|
|
#include "llvm/Support/COFF.h"
|
|
#include "llvm/Support/Debug.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
class ARMWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
|
|
public:
|
|
ARMWinCOFFObjectWriter(bool Is64Bit)
|
|
: MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARMNT) {
|
|
assert(!Is64Bit && "AArch64 support not yet implemented");
|
|
}
|
|
virtual ~ARMWinCOFFObjectWriter() { }
|
|
|
|
unsigned getRelocType(const MCValue &Target, const MCFixup &Fixup,
|
|
bool IsCrossSection) const override;
|
|
};
|
|
|
|
unsigned ARMWinCOFFObjectWriter::getRelocType(const MCValue &Target,
|
|
const MCFixup &Fixup,
|
|
bool IsCrossSection) const {
|
|
assert(getMachine() == COFF::IMAGE_FILE_MACHINE_ARMNT &&
|
|
"AArch64 support not yet implemented");
|
|
|
|
MCSymbolRefExpr::VariantKind Modifier =
|
|
Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
|
|
|
|
switch (static_cast<unsigned>(Fixup.getKind())) {
|
|
default: llvm_unreachable("unsupported relocation type");
|
|
case FK_Data_4:
|
|
switch (Modifier) {
|
|
case MCSymbolRefExpr::VK_COFF_IMGREL32:
|
|
return COFF::IMAGE_REL_ARM_ADDR32NB;
|
|
case MCSymbolRefExpr::VK_SECREL:
|
|
return COFF::IMAGE_REL_ARM_SECREL;
|
|
default:
|
|
return COFF::IMAGE_REL_ARM_ADDR32;
|
|
}
|
|
case FK_SecRel_4:
|
|
return COFF::IMAGE_REL_ARM_SECREL;
|
|
case ARM::fixup_t2_condbranch:
|
|
return COFF::IMAGE_REL_ARM_BRANCH20T;
|
|
case ARM::fixup_t2_uncondbranch:
|
|
return COFF::IMAGE_REL_ARM_BRANCH24T;
|
|
case ARM::fixup_arm_thumb_bl:
|
|
case ARM::fixup_arm_thumb_blx:
|
|
return COFF::IMAGE_REL_ARM_BLX23T;
|
|
case ARM::fixup_t2_movw_lo16:
|
|
return COFF::IMAGE_REL_ARM_MOV32T;
|
|
case ARM::fixup_t2_movt_hi16:
|
|
llvm_unreachable("High-word for pair-wise relocations are contiguously "
|
|
"addressed as an IMAGE_REL_ARM_MOV32T relocation");
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace llvm {
|
|
MCObjectWriter *createARMWinCOFFObjectWriter(raw_ostream &OS, bool Is64Bit) {
|
|
MCWinCOFFObjectTargetWriter *MOTW = new ARMWinCOFFObjectWriter(Is64Bit);
|
|
return createWinCOFFObjectWriter(MOTW, OS);
|
|
}
|
|
}
|
|
|