LLVM  14.0.0git
CSKYAsmBackend.cpp
Go to the documentation of this file.
1 //===-- CSKYAsmBackend.cpp - CSKY Assembler Backend -----------------------===//
2 //
3 // 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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "CSKYAsmBackend.h"
11 #include "llvm/ADT/DenseMap.h"
12 #include "llvm/MC/MCAsmLayout.h"
13 #include "llvm/MC/MCAssembler.h"
14 #include "llvm/MC/MCContext.h"
16 #include "llvm/MC/MCObjectWriter.h"
17 #include "llvm/Support/Debug.h"
18 
19 #define DEBUG_TYPE "csky-asmbackend"
20 
21 using namespace llvm;
22 
23 std::unique_ptr<MCObjectTargetWriter>
26 }
27 
28 const MCFixupKindInfo &
30 
32  {CSKY::Fixups::fixup_csky_addr32, {"fixup_csky_addr32", 0, 32, 0}},
33  {CSKY::Fixups::fixup_csky_addr_hi16, {"fixup_csky_addr_hi16", 0, 32, 0}},
34  {CSKY::Fixups::fixup_csky_addr_lo16, {"fixup_csky_addr_lo16", 0, 32, 0}},
36  {"fixup_csky_pcrel_imm16_scale2", 0, 32, MCFixupKindInfo::FKF_IsPCRel}},
38  {"fixup_csky_pcrel_uimm16_scale4", 0, 32,
42  {"fixup_csky_pcrel_uimm8_scale4", 0, 32,
46  {"fixup_csky_pcrel_imm26_scale2", 0, 32, MCFixupKindInfo::FKF_IsPCRel}},
48  {"fixup_csky_pcrel_imm18_scale2", 0, 32, MCFixupKindInfo::FKF_IsPCRel}},
49  {CSKY::Fixups::fixup_csky_got32, {"fixup_csky_got32", 0, 32, 0}},
51  {"fixup_csky_got_imm18_scale4", 0, 32, 0}},
52  {CSKY::Fixups::fixup_csky_gotoff, {"fixup_csky_gotoff", 0, 32, 0}},
54  {"fixup_csky_gotpc", 0, 32, MCFixupKindInfo::FKF_IsPCRel}},
55  {CSKY::Fixups::fixup_csky_plt32, {"fixup_csky_plt32", 0, 32, 0}},
57  {"fixup_csky_plt_imm18_scale4", 0, 32, 0}},
59  {"fixup_csky_pcrel_imm10_scale2", 0, 16, MCFixupKindInfo::FKF_IsPCRel}},
61  {"fixup_csky_pcrel_uimm7_scale4", 0, 16,
65  {"fixup_csky_doffset_imm18", 0, 18, 0}},
67  {"fixup_csky_doffset_imm18_scale2", 0, 18, 0}},
69  {"fixup_csky_doffset_imm18_scale4", 0, 18, 0}}};
70 
72  "Not all fixup kinds added to Infos array");
73 
76  "Invalid kind!");
77 
78  return Infos[Kind];
79  } else if (Kind < FirstTargetFixupKind) {
81  } else {
83  }
84 }
85 
87  MCContext &Ctx) {
88  switch (Fixup.getTargetKind()) {
89  default:
90  llvm_unreachable("Unknown fixup kind!");
91  case FK_Data_1:
92  case FK_Data_2:
93  case FK_Data_4:
94  case FK_Data_8:
95  return Value;
97  return Value & 0xffffffff;
99  if (!isIntN(17, Value))
100  Ctx.reportError(Fixup.getLoc(), "out of range pc-relative fixup value.");
101  if (Value & 0x1)
102  Ctx.reportError(Fixup.getLoc(), "fixup value must be 2-byte aligned.");
103 
104  return (Value >> 1) & 0xffff;
106  if (!isUIntN(18, Value))
107  Ctx.reportError(Fixup.getLoc(), "out of range pc-relative fixup value.");
108  if (Value & 0x3)
109  Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned.");
110 
111  return (Value >> 2) & 0xffff;
113  if (!isIntN(27, Value))
114  Ctx.reportError(Fixup.getLoc(), "out of range pc-relative fixup value.");
115  if (Value & 0x1)
116  Ctx.reportError(Fixup.getLoc(), "fixup value must be 2-byte aligned.");
117 
118  return (Value >> 1) & 0x3ffffff;
120  if (!isIntN(19, Value))
121  Ctx.reportError(Fixup.getLoc(), "out of range pc-relative fixup value.");
122  if (Value & 0x1)
123  Ctx.reportError(Fixup.getLoc(), "fixup value must be 2-byte aligned.");
124 
125  return (Value >> 1) & 0x3ffff;
126  }
127 }
128 
130  const MCValue &Target,
132  bool IsResolved,
133  const MCSubtargetInfo *STI) const {
134  MCFixupKind Kind = Fixup.getKind();
136  return;
137  MCContext &Ctx = Asm.getContext();
139  if (!Value)
140  return; // Doesn't change encoding.
141  // Apply any target-specific value adjustments.
143 
144  // Shift the value into position.
145  Value <<= Info.TargetOffset;
146 
147  unsigned Offset = Fixup.getOffset();
148  unsigned NumBytes = alignTo(Info.TargetSize + Info.TargetOffset, 8) / 8;
149 
150  assert(Offset + NumBytes <= Data.size() && "Invalid fixup offset!");
151 
152  // For each byte of the fragment that the fixup touches, mask in the
153  // bits from the fixup value.
154  bool IsLittleEndian = (Endian == support::little);
155 
156  if (IsLittleEndian && (NumBytes == 4)) {
157  Data[Offset + 0] |= uint8_t((Value >> 16) & 0xff);
158  Data[Offset + 1] |= uint8_t((Value >> 24) & 0xff);
159  Data[Offset + 2] |= uint8_t(Value & 0xff);
160  Data[Offset + 3] |= uint8_t((Value >> 8) & 0xff);
161  } else {
162  for (unsigned I = 0; I != NumBytes; I++) {
163  unsigned Idx = IsLittleEndian ? I : (NumBytes - 1 - I);
164  Data[Offset + Idx] |= uint8_t((Value >> (I * 8)) & 0xff);
165  }
166  }
167 }
168 
170  const MCRelaxableFragment *DF,
171  const MCAsmLayout &Layout) const {
172  return false;
173 }
174 
176  const MCSubtargetInfo &STI) const {
177  llvm_unreachable("CSKYAsmBackend::relaxInstruction() unimplemented");
178 }
179 
181  const MCSubtargetInfo *STI) const {
182  if (Count % 2)
183  return false;
184 
185  // MOV32 r0, r0
186  while (Count >= 4) {
187  OS.write("\xc4\x00\x48\x20", 4);
188  Count -= 4;
189  }
190  // MOV16 r0, r0
191  if (Count)
192  OS.write("\x6c\x03", 2);
193 
194  return true;
195 }
196 
198  const MCSubtargetInfo &STI,
199  const MCRegisterInfo &MRI,
200  const MCTargetOptions &Options) {
201  return new CSKYAsmBackend(STI, Options);
202 }
llvm::alignTo
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:148
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AllocatorList.h:23
llvm::MCRelaxableFragment
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:271
llvm::MCAsmBackend::getFixupKindInfo
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
Definition: MCAsmBackend.cpp:74
llvm::CSKYAsmBackend
Definition: CSKYAsmBackend.h:18
T
llvm::MCContext
Context object for machine code objects.
Definition: MCContext.h:72
llvm::Target
Target - Wrapper for Target specific information.
Definition: TargetRegistry.h:137
llvm::FirstTargetFixupKind
@ FirstTargetFixupKind
Definition: MCFixup.h:45
llvm::CSKY::fixup_csky_pcrel_imm10_scale2
@ fixup_csky_pcrel_imm10_scale2
Definition: CSKYFixupKinds.h:43
MCAssembler.h
llvm::CSKY::fixup_csky_gotpc
@ fixup_csky_gotpc
Definition: CSKYFixupKinds.h:31
DenseMap.h
llvm::CSKY::fixup_csky_pcrel_uimm7_scale4
@ fixup_csky_pcrel_uimm7_scale4
Definition: CSKYFixupKinds.h:45
MCFixupKindInfo.h
Offset
uint64_t Offset
Definition: ELFObjHandler.cpp:80
llvm::CSKY::fixup_csky_got32
@ fixup_csky_got32
Definition: CSKYFixupKinds.h:35
llvm::CSKY::fixup_csky_doffset_imm18
@ fixup_csky_doffset_imm18
Definition: CSKYFixupKinds.h:49
llvm::MCInst
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
llvm::CSKY::fixup_csky_got_imm18_scale4
@ fixup_csky_got_imm18_scale4
Definition: CSKYFixupKinds.h:37
llvm::CSKYAsmBackend::getNumFixupKinds
unsigned int getNumFixupKinds() const override
Get the number of target specific fixup kinds.
Definition: CSKYAsmBackend.h:24
llvm::MCFixupKindInfo::FKF_IsAlignedDownTo32Bits
@ FKF_IsAlignedDownTo32Bits
Should this fixup kind force a 4-byte aligned effective PC value?
Definition: MCFixupKindInfo.h:22
llvm::CSKY::fixup_csky_pcrel_uimm8_scale4
@ fixup_csky_pcrel_uimm8_scale4
Definition: CSKYFixupKinds.h:47
llvm::Data
@ Data
Definition: SIMachineScheduler.h:55
llvm::MCAsmBackend::Endian
const support::endianness Endian
Definition: MCAsmBackend.h:45
llvm::FirstLiteralRelocationKind
@ FirstLiteralRelocationKind
The range [FirstLiteralRelocationKind, MaxTargetFixupKind) is used for relocations coming from ....
Definition: MCFixup.h:50
x3
In x86 we generate this spiffy xmm0 xmm0 ret in x86 we generate this which could be xmm1 movss xmm1 xmm0 ret In sse4 we could use insertps to make both better Here s another testcase that could use x3
Definition: README-SSE.txt:547
llvm::FK_Data_4
@ FK_Data_4
A four-byte fixup.
Definition: MCFixup.h:25
llvm::MCAsmBackend
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:36
llvm::MutableArrayRef< char >
llvm::CSKY::fixup_csky_plt32
@ fixup_csky_plt32
Definition: CSKYFixupKinds.h:39
llvm::support::little
@ little
Definition: Endian.h:27
CSKYAsmBackend.h
llvm::CSKYAsmBackend::applyFixup
void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, MutableArrayRef< char > Data, uint64_t Value, bool IsResolved, const MCSubtargetInfo *STI) const override
Apply the Value for given Fixup into the provided data fragment, at the offset specified by the fixup...
Definition: CSKYAsmBackend.cpp:129
llvm::CSKY::fixup_csky_doffset_imm18_scale4
@ fixup_csky_doffset_imm18_scale4
Definition: CSKYFixupKinds.h:53
MCContext.h
llvm::CSKY::fixup_csky_doffset_imm18_scale2
@ fixup_csky_doffset_imm18_scale2
Definition: CSKYFixupKinds.h:51
llvm::isUIntN
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:455
llvm::createCSKYAsmBackend
MCAsmBackend * createCSKYAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
Definition: CSKYAsmBackend.cpp:197
llvm::raw_ostream::write
raw_ostream & write(unsigned char C)
Definition: raw_ostream.cpp:219
Options
const char LLVMTargetMachineRef LLVMPassBuilderOptionsRef Options
Definition: PassBuilderBindings.cpp:48
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:54
Info
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
llvm::CSKY::fixup_csky_addr_lo16
@ fixup_csky_addr_lo16
Definition: CSKYFixupKinds.h:21
llvm::isIntN
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:460
llvm::lltok::Kind
Kind
Definition: LLToken.h:18
llvm::CSKY::fixup_csky_pcrel_imm26_scale2
@ fixup_csky_pcrel_imm26_scale2
Definition: CSKYFixupKinds.h:27
DF
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
llvm::CSKY::fixup_csky_pcrel_imm16_scale2
@ fixup_csky_pcrel_imm16_scale2
Definition: CSKYFixupKinds.h:23
llvm::MCAssembler
Definition: MCAssembler.h:60
uint64_t
llvm::CSKYAsmBackend::writeNopData
bool writeNopData(raw_ostream &OS, uint64_t Count, const MCSubtargetInfo *STI) const override
Write an (optimal) nop sequence of Count bytes to the given output.
Definition: CSKYAsmBackend.cpp:180
llvm::MCFixupKindInfo::FKF_IsPCRel
@ FKF_IsPCRel
Is this fixup kind PCrelative? This is used by the assembler backend to evaluate fixup values in a ta...
Definition: MCFixupKindInfo.h:19
llvm::DenseMap
Definition: DenseMap.h:714
I
#define I(x, y, z)
Definition: MD5.cpp:58
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::CSKYAsmBackend::createObjectTargetWriter
std::unique_ptr< MCObjectTargetWriter > createObjectTargetWriter() const override
Definition: CSKYAsmBackend.cpp:24
llvm::MCFixupKindInfo
Target independent information on a fixup kind.
Definition: MCFixupKindInfo.h:15
llvm::CSKY::fixup_csky_addr_hi16
@ fixup_csky_addr_hi16
Definition: CSKYFixupKinds.h:19
CSKYMCTargetDesc.h
llvm::MCContext::reportError
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:963
llvm::CSKY::fixup_csky_pcrel_uimm16_scale4
@ fixup_csky_pcrel_uimm16_scale4
Definition: CSKYFixupKinds.h:25
llvm::FK_Data_1
@ FK_Data_1
A one-byte fixup.
Definition: MCFixup.h:23
llvm::MCTargetOptions
Definition: MCTargetOptions.h:36
llvm::FK_NONE
@ FK_NONE
A no-op fixup.
Definition: MCFixup.h:22
llvm::CSKYAsmBackend::relaxInstruction
void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const override
Relax the instruction in the given fragment to the next wider instruction.
Definition: CSKYAsmBackend.cpp:175
llvm::CSKY::fixup_csky_gotoff
@ fixup_csky_gotoff
Definition: CSKYFixupKinds.h:33
llvm::CSKY::fixup_csky_plt_imm18_scale4
@ fixup_csky_plt_imm18_scale4
Definition: CSKYFixupKinds.h:41
Fixup
PowerPC TLS Dynamic Call Fixup
Definition: PPCTLSDynamicCall.cpp:233
adjustFixupValue
static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value, MCContext &Ctx)
Definition: CSKYAsmBackend.cpp:86
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:134
llvm::CSKY::fixup_csky_pcrel_imm18_scale2
@ fixup_csky_pcrel_imm18_scale2
Definition: CSKYFixupKinds.h:29
llvm::MCRegisterInfo
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Definition: MCRegisterInfo.h:135
MRI
unsigned const MachineRegisterInfo * MRI
Definition: AArch64AdvSIMDScalarPass.cpp:105
MCAsmLayout.h
llvm::createCSKYELFObjectWriter
std::unique_ptr< MCObjectTargetWriter > createCSKYELFObjectWriter()
Definition: CSKYELFObjectWriter.cpp:43
MCObjectWriter.h
llvm::CSKY::NumTargetFixupKinds
@ NumTargetFixupKinds
Definition: CSKYFixupKinds.h:56
llvm::MCAsmLayout
Encapsulates the layout of an assembly file at a particular point in time.
Definition: MCAsmLayout.h:28
llvm::CSKYAsmBackend::getFixupKindInfo
const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const override
Get information on a fixup kind.
Definition: CSKYAsmBackend.cpp:29
llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::size
unsigned size() const
Definition: DenseMap.h:100
llvm::TargetStackID::Value
Value
Definition: TargetFrameLowering.h:27
llvm::CSKYAsmBackend::fixupNeedsRelaxation
bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, const MCRelaxableFragment *DF, const MCAsmLayout &Layout) const override
Simple predicate for targets where !Resolved implies requiring relaxation.
Definition: CSKYAsmBackend.cpp:169
llvm::MCFixupKind
MCFixupKind
Extensible enumeration to represent the type of a fixup.
Definition: MCFixup.h:21
llvm::FK_Data_8
@ FK_Data_8
A eight-byte fixup.
Definition: MCFixup.h:26
llvm::HexStyle::Asm
@ Asm
0ffh
Definition: MCInstPrinter.h:34
llvm::CSKY::fixup_csky_addr32
@ fixup_csky_addr32
Definition: CSKYFixupKinds.h:17
llvm::MCValue
This represents an "assembler immediate".
Definition: MCValue.h:37
llvm::FK_Data_2
@ FK_Data_2
A two-byte fixup.
Definition: MCFixup.h:24
llvm::MCSubtargetInfo
Generic base class for all target subtargets.
Definition: MCSubtargetInfo.h:75
llvm::MCFixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:71
llvm::Value
LLVM Value Representation.
Definition: Value.h:74
Debug.h