X86WinCOFFObjectWriter.cpp revision 234353
1//===-- X86WinCOFFObjectWriter.cpp - X86 Win COFF Writer ------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "MCTargetDesc/X86FixupKinds.h"
11#include "MCTargetDesc/X86MCTargetDesc.h"
12#include "llvm/MC/MCWinCOFFObjectWriter.h"
13#include "llvm/Support/COFF.h"
14#include "llvm/Support/ErrorHandling.h"
15
16using namespace llvm;
17
18namespace llvm {
19  class MCObjectWriter;
20}
21
22namespace {
23  class X86WinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
24    const bool Is64Bit;
25
26  public:
27    X86WinCOFFObjectWriter(bool Is64Bit_);
28    ~X86WinCOFFObjectWriter();
29
30    virtual unsigned getRelocType(unsigned FixupKind) const;
31  };
32}
33
34X86WinCOFFObjectWriter::X86WinCOFFObjectWriter(bool Is64Bit_)
35  : MCWinCOFFObjectTargetWriter(Is64Bit_ ? COFF::IMAGE_FILE_MACHINE_AMD64 :
36                                COFF::IMAGE_FILE_MACHINE_I386),
37    Is64Bit(Is64Bit_) {}
38
39X86WinCOFFObjectWriter::~X86WinCOFFObjectWriter() {}
40
41unsigned X86WinCOFFObjectWriter::getRelocType(unsigned FixupKind) const {
42  switch (FixupKind) {
43  case FK_PCRel_4:
44  case X86::reloc_riprel_4byte:
45  case X86::reloc_riprel_4byte_movq_load:
46    return Is64Bit ? COFF::IMAGE_REL_AMD64_REL32 : COFF::IMAGE_REL_I386_REL32;
47  case FK_Data_4:
48  case X86::reloc_signed_4byte:
49    return Is64Bit ? COFF::IMAGE_REL_AMD64_ADDR32 : COFF::IMAGE_REL_I386_DIR32;
50  case FK_Data_8:
51    if (Is64Bit)
52      return COFF::IMAGE_REL_AMD64_ADDR64;
53    llvm_unreachable("unsupported relocation type");
54  case FK_SecRel_4:
55    return Is64Bit ? COFF::IMAGE_REL_AMD64_SECREL : COFF::IMAGE_REL_I386_SECREL;
56  default:
57    llvm_unreachable("unsupported relocation type");
58  }
59}
60
61MCObjectWriter *llvm::createX86WinCOFFObjectWriter(raw_ostream &OS,
62                                                   bool Is64Bit) {
63  MCWinCOFFObjectTargetWriter *MOTW = new X86WinCOFFObjectWriter(Is64Bit);
64  return createWinCOFFObjectWriter(MOTW, OS);
65}
66