You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.207
Former-commit-id: 3b152f462918d427ce18620a2cbe4f8b79650449
This commit is contained in:
parent
8e12397d70
commit
eb85e2fc17
@ -1,112 +0,0 @@
|
||||
//===-- X86WinCOFFObjectWriter.cpp - X86 Win COFF Writer ------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/X86FixupKinds.h"
|
||||
#include "MCTargetDesc/X86MCTargetDesc.h"
|
||||
#include "llvm/BinaryFormat/COFF.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCFixup.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/MC/MCWinCOFFObjectWriter.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
class X86WinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
|
||||
public:
|
||||
X86WinCOFFObjectWriter(bool Is64Bit);
|
||||
~X86WinCOFFObjectWriter() override = default;
|
||||
|
||||
unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
|
||||
const MCFixup &Fixup, bool IsCrossSection,
|
||||
const MCAsmBackend &MAB) const override;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
X86WinCOFFObjectWriter::X86WinCOFFObjectWriter(bool Is64Bit)
|
||||
: MCWinCOFFObjectTargetWriter(Is64Bit ? COFF::IMAGE_FILE_MACHINE_AMD64
|
||||
: COFF::IMAGE_FILE_MACHINE_I386) {}
|
||||
|
||||
unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
|
||||
const MCValue &Target,
|
||||
const MCFixup &Fixup,
|
||||
bool IsCrossSection,
|
||||
const MCAsmBackend &MAB) const {
|
||||
unsigned FixupKind = Fixup.getKind();
|
||||
if (IsCrossSection) {
|
||||
if (FixupKind != FK_Data_4 && FixupKind != llvm::X86::reloc_signed_4byte) {
|
||||
Ctx.reportError(Fixup.getLoc(), "Cannot represent this expression");
|
||||
return COFF::IMAGE_REL_AMD64_ADDR32;
|
||||
}
|
||||
FixupKind = FK_PCRel_4;
|
||||
}
|
||||
|
||||
MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?
|
||||
MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
|
||||
|
||||
if (getMachine() == COFF::IMAGE_FILE_MACHINE_AMD64) {
|
||||
switch (FixupKind) {
|
||||
case FK_PCRel_4:
|
||||
case X86::reloc_riprel_4byte:
|
||||
case X86::reloc_riprel_4byte_movq_load:
|
||||
case X86::reloc_riprel_4byte_relax:
|
||||
case X86::reloc_riprel_4byte_relax_rex:
|
||||
return COFF::IMAGE_REL_AMD64_REL32;
|
||||
case FK_Data_4:
|
||||
case X86::reloc_signed_4byte:
|
||||
case X86::reloc_signed_4byte_relax:
|
||||
if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)
|
||||
return COFF::IMAGE_REL_AMD64_ADDR32NB;
|
||||
if (Modifier == MCSymbolRefExpr::VK_SECREL)
|
||||
return COFF::IMAGE_REL_AMD64_SECREL;
|
||||
return COFF::IMAGE_REL_AMD64_ADDR32;
|
||||
case FK_Data_8:
|
||||
return COFF::IMAGE_REL_AMD64_ADDR64;
|
||||
case FK_SecRel_2:
|
||||
return COFF::IMAGE_REL_AMD64_SECTION;
|
||||
case FK_SecRel_4:
|
||||
return COFF::IMAGE_REL_AMD64_SECREL;
|
||||
default:
|
||||
llvm_unreachable("unsupported relocation type");
|
||||
}
|
||||
} else if (getMachine() == COFF::IMAGE_FILE_MACHINE_I386) {
|
||||
switch (FixupKind) {
|
||||
case FK_PCRel_4:
|
||||
case X86::reloc_riprel_4byte:
|
||||
case X86::reloc_riprel_4byte_movq_load:
|
||||
return COFF::IMAGE_REL_I386_REL32;
|
||||
case FK_Data_4:
|
||||
case X86::reloc_signed_4byte:
|
||||
case X86::reloc_signed_4byte_relax:
|
||||
if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)
|
||||
return COFF::IMAGE_REL_I386_DIR32NB;
|
||||
if (Modifier == MCSymbolRefExpr::VK_SECREL)
|
||||
return COFF::IMAGE_REL_AMD64_SECREL;
|
||||
return COFF::IMAGE_REL_I386_DIR32;
|
||||
case FK_SecRel_2:
|
||||
return COFF::IMAGE_REL_I386_SECTION;
|
||||
case FK_SecRel_4:
|
||||
return COFF::IMAGE_REL_I386_SECREL;
|
||||
default:
|
||||
llvm_unreachable("unsupported relocation type");
|
||||
}
|
||||
} else
|
||||
llvm_unreachable("Unsupported COFF machine type.");
|
||||
}
|
||||
|
||||
std::unique_ptr<MCObjectWriter>
|
||||
llvm::createX86WinCOFFObjectWriter(raw_pwrite_stream &OS, bool Is64Bit) {
|
||||
auto MOTW = llvm::make_unique<X86WinCOFFObjectWriter>(Is64Bit);
|
||||
return createWinCOFFObjectWriter(std::move(MOTW), OS);
|
||||
}
|
Reference in New Issue
Block a user