blob: 900c5fe30364c6333852b23bd970694d1b564f13 [file] [log] [blame]
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +00001//===-- ARMWinCOFFObjectWriter.cpp - ARM Windows COFF Object Writer -- C++ -==//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "MCTargetDesc/ARMFixupKinds.h"
Chandler Carruth71f308a2015-02-13 09:09:03 +000010#include "llvm/ADT/Twine.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000011#include "llvm/BinaryFormat/COFF.h"
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000012#include "llvm/MC/MCAsmBackend.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000013#include "llvm/MC/MCExpr.h"
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000014#include "llvm/MC/MCFixup.h"
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000015#include "llvm/MC/MCFixupKindInfo.h"
Lang Hames60fbc7c2017-10-10 16:28:07 +000016#include "llvm/MC/MCObjectWriter.h"
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000017#include "llvm/MC/MCValue.h"
18#include "llvm/MC/MCWinCOFFObjectWriter.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000019#include "llvm/Support/ErrorHandling.h"
20#include "llvm/Support/raw_ostream.h"
21#include <cassert>
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000022
23using namespace llvm;
24
25namespace {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000026
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000027class ARMWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
28public:
29 ARMWinCOFFObjectWriter(bool Is64Bit)
30 : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARMNT) {
31 assert(!Is64Bit && "AArch64 support not yet implemented");
32 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000033
34 ~ARMWinCOFFObjectWriter() override = default;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000035
Rafael Espindola58173b92017-06-23 04:07:44 +000036 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
37 const MCFixup &Fixup, bool IsCrossSection,
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000038 const MCAsmBackend &MAB) const override;
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000039
40 bool recordRelocation(const MCFixup &) const override;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000041};
42
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000043} // end anonymous namespace
44
Rafael Espindola58173b92017-06-23 04:07:44 +000045unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
46 const MCValue &Target,
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000047 const MCFixup &Fixup,
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000048 bool IsCrossSection,
49 const MCAsmBackend &MAB) const {
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000050 assert(getMachine() == COFF::IMAGE_FILE_MACHINE_ARMNT &&
51 "AArch64 support not yet implemented");
52
53 MCSymbolRefExpr::VariantKind Modifier =
54 Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
55
56 switch (static_cast<unsigned>(Fixup.getKind())) {
Saleem Abdulrasool10ed0ba2015-01-22 04:03:32 +000057 default: {
58 const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind());
59 report_fatal_error(Twine("unsupported relocation type: ") + Info.Name);
60 }
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000061 case FK_Data_4:
62 switch (Modifier) {
63 case MCSymbolRefExpr::VK_COFF_IMGREL32:
64 return COFF::IMAGE_REL_ARM_ADDR32NB;
65 case MCSymbolRefExpr::VK_SECREL:
66 return COFF::IMAGE_REL_ARM_SECREL;
67 default:
68 return COFF::IMAGE_REL_ARM_ADDR32;
69 }
Saleem Abdulrasoolfc6b85b2014-05-08 01:35:57 +000070 case FK_SecRel_2:
71 return COFF::IMAGE_REL_ARM_SECTION;
Saleem Abdulrasool729c7a02014-05-04 23:13:15 +000072 case FK_SecRel_4:
73 return COFF::IMAGE_REL_ARM_SECREL;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000074 case ARM::fixup_t2_condbranch:
75 return COFF::IMAGE_REL_ARM_BRANCH20T;
76 case ARM::fixup_t2_uncondbranch:
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000077 case ARM::fixup_arm_thumb_bl:
Saleem Abdulrasoolaaa72c52018-09-13 04:55:08 +000078 return COFF::IMAGE_REL_ARM_BRANCH24T;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000079 case ARM::fixup_arm_thumb_blx:
80 return COFF::IMAGE_REL_ARM_BLX23T;
81 case ARM::fixup_t2_movw_lo16:
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000082 case ARM::fixup_t2_movt_hi16:
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000083 return COFF::IMAGE_REL_ARM_MOV32T;
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000084 }
85}
Saleem Abdulrasool0bd31832014-05-21 23:17:56 +000086
87bool ARMWinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const {
88 return static_cast<unsigned>(Fixup.getKind()) != ARM::fixup_t2_movt_hi16;
89}
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000090
91namespace llvm {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000092
Peter Collingbournedcd7d6c2018-05-21 19:20:29 +000093std::unique_ptr<MCObjectTargetWriter>
94createARMWinCOFFObjectWriter(bool Is64Bit) {
Jonas Devlieghere0eaee542019-08-15 15:54:37 +000095 return std::make_unique<ARMWinCOFFObjectWriter>(Is64Bit);
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000096}
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +000097
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000098} // end namespace llvm