blob: 8ae713b7b48974fba45a14399dc3435981e0f888 [file] [log] [blame]
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +00001//===-- ARMWinCOFFObjectWriter.cpp - ARM Windows COFF Object Writer -- C++ -==//
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/ARMFixupKinds.h"
Chandler Carruth71f308a2015-02-13 09:09:03 +000011#include "llvm/ADT/Twine.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000012#include "llvm/BinaryFormat/COFF.h"
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000013#include "llvm/MC/MCAsmBackend.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000014#include "llvm/MC/MCExpr.h"
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000015#include "llvm/MC/MCFixup.h"
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000016#include "llvm/MC/MCFixupKindInfo.h"
Lang Hames60fbc7c2017-10-10 16:28:07 +000017#include "llvm/MC/MCObjectWriter.h"
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000018#include "llvm/MC/MCValue.h"
19#include "llvm/MC/MCWinCOFFObjectWriter.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000020#include "llvm/Support/ErrorHandling.h"
21#include "llvm/Support/raw_ostream.h"
22#include <cassert>
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000023
24using namespace llvm;
25
26namespace {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000027
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000028class ARMWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
29public:
30 ARMWinCOFFObjectWriter(bool Is64Bit)
31 : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARMNT) {
32 assert(!Is64Bit && "AArch64 support not yet implemented");
33 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000034
35 ~ARMWinCOFFObjectWriter() override = default;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000036
Rafael Espindola58173b92017-06-23 04:07:44 +000037 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
38 const MCFixup &Fixup, bool IsCrossSection,
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000039 const MCAsmBackend &MAB) const override;
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000040
41 bool recordRelocation(const MCFixup &) const override;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000042};
43
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000044} // end anonymous namespace
45
Rafael Espindola58173b92017-06-23 04:07:44 +000046unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
47 const MCValue &Target,
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000048 const MCFixup &Fixup,
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000049 bool IsCrossSection,
50 const MCAsmBackend &MAB) const {
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000051 assert(getMachine() == COFF::IMAGE_FILE_MACHINE_ARMNT &&
52 "AArch64 support not yet implemented");
53
54 MCSymbolRefExpr::VariantKind Modifier =
55 Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
56
57 switch (static_cast<unsigned>(Fixup.getKind())) {
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000058 default: {
59 const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind());
60 report_fatal_error(Twine("unsupported relocation type: ") + Info.Name);
61 }
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000062 case FK_Data_4:
63 switch (Modifier) {
64 case MCSymbolRefExpr::VK_COFF_IMGREL32:
65 return COFF::IMAGE_REL_ARM_ADDR32NB;
66 case MCSymbolRefExpr::VK_SECREL:
67 return COFF::IMAGE_REL_ARM_SECREL;
68 default:
69 return COFF::IMAGE_REL_ARM_ADDR32;
70 }
Saleem Abdulrasoolfc6b85b2014-05-08 01:35:57 +000071 case FK_SecRel_2:
72 return COFF::IMAGE_REL_ARM_SECTION;
Saleem Abdulrasool729c7a02014-05-04 23:13:15 +000073 case FK_SecRel_4:
74 return COFF::IMAGE_REL_ARM_SECREL;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000075 case ARM::fixup_t2_condbranch:
76 return COFF::IMAGE_REL_ARM_BRANCH20T;
77 case ARM::fixup_t2_uncondbranch:
78 return COFF::IMAGE_REL_ARM_BRANCH24T;
79 case ARM::fixup_arm_thumb_bl:
80 case ARM::fixup_arm_thumb_blx:
81 return COFF::IMAGE_REL_ARM_BLX23T;
82 case ARM::fixup_t2_movw_lo16:
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000083 case ARM::fixup_t2_movt_hi16:
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000084 return COFF::IMAGE_REL_ARM_MOV32T;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000085 }
86}
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000087
88bool ARMWinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const {
89 return static_cast<unsigned>(Fixup.getKind()) != ARM::fixup_t2_movt_hi16;
90}
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000091
92namespace llvm {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000093
Peter Collingbournedcd7d6c2018-05-21 19:20:29 +000094std::unique_ptr<MCObjectTargetWriter>
95createARMWinCOFFObjectWriter(bool Is64Bit) {
96 return llvm::make_unique<ARMWinCOFFObjectWriter>(Is64Bit);
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000097}
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000098
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000099} // end namespace llvm