LLVM  7.0.0svn
SystemZMCAsmBackend.cpp
Go to the documentation of this file.
1 //===-- SystemZMCAsmBackend.cpp - SystemZ assembler backend ---------------===//
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 
12 #include "llvm/MC/MCAsmBackend.h"
15 #include "llvm/MC/MCInst.h"
16 #include "llvm/MC/MCObjectWriter.h"
18 
19 using namespace llvm;
20 
21 // Value is a fully-resolved relocation value: Symbol + Addend [- Pivot].
22 // Return the bits that should be installed in a relocation field for
23 // fixup kind Kind.
24 static uint64_t extractBitsForFixup(MCFixupKind Kind, uint64_t Value) {
25  if (Kind < FirstTargetFixupKind)
26  return Value;
27 
28  switch (unsigned(Kind)) {
33  return (int64_t)Value / 2;
34 
36  return 0;
37  }
38 
39  llvm_unreachable("Unknown fixup kind!");
40 }
41 
42 namespace {
43 class SystemZMCAsmBackend : public MCAsmBackend {
44  uint8_t OSABI;
45 public:
46  SystemZMCAsmBackend(uint8_t osABI)
47  : OSABI(osABI) {}
48 
49  // Override MCAsmBackend
50  unsigned getNumFixupKinds() const override {
52  }
53  const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
54  void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
56  uint64_t Value, bool IsResolved) const override;
57  bool mayNeedRelaxation(const MCInst &Inst) const override {
58  return false;
59  }
60  bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
61  const MCRelaxableFragment *Fragment,
62  const MCAsmLayout &Layout) const override {
63  return false;
64  }
65  void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
66  MCInst &Res) const override {
67  llvm_unreachable("SystemZ does do not have assembler relaxation");
68  }
69  bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override;
70  std::unique_ptr<MCObjectWriter>
71  createObjectWriter(raw_pwrite_stream &OS) const override {
72  return createSystemZObjectWriter(OS, OSABI);
73  }
74 };
75 } // end anonymous namespace
76 
77 const MCFixupKindInfo &
78 SystemZMCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
79  const static MCFixupKindInfo Infos[SystemZ::NumTargetFixupKinds] = {
80  { "FK_390_PC12DBL", 4, 12, MCFixupKindInfo::FKF_IsPCRel },
81  { "FK_390_PC16DBL", 0, 16, MCFixupKindInfo::FKF_IsPCRel },
82  { "FK_390_PC24DBL", 0, 24, MCFixupKindInfo::FKF_IsPCRel },
83  { "FK_390_PC32DBL", 0, 32, MCFixupKindInfo::FKF_IsPCRel },
84  { "FK_390_TLS_CALL", 0, 0, 0 }
85  };
86 
87  if (Kind < FirstTargetFixupKind)
88  return MCAsmBackend::getFixupKindInfo(Kind);
89 
90  assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
91  "Invalid kind!");
92  return Infos[Kind - FirstTargetFixupKind];
93 }
94 
95 void SystemZMCAsmBackend::applyFixup(const MCAssembler &Asm,
96  const MCFixup &Fixup,
97  const MCValue &Target,
99  bool IsResolved) const {
100  MCFixupKind Kind = Fixup.getKind();
101  unsigned Offset = Fixup.getOffset();
102  unsigned BitSize = getFixupKindInfo(Kind).TargetSize;
103  unsigned Size = (BitSize + 7) / 8;
104 
105  assert(Offset + Size <= Data.size() && "Invalid fixup offset!");
106 
107  // Big-endian insertion of Size bytes.
108  Value = extractBitsForFixup(Kind, Value);
109  if (BitSize < 64)
110  Value &= ((uint64_t)1 << BitSize) - 1;
111  unsigned ShiftValue = (Size * 8) - 8;
112  for (unsigned I = 0; I != Size; ++I) {
113  Data[Offset + I] |= uint8_t(Value >> ShiftValue);
114  ShiftValue -= 8;
115  }
116 }
117 
118 bool SystemZMCAsmBackend::writeNopData(uint64_t Count,
119  MCObjectWriter *OW) const {
120  for (uint64_t I = 0; I != Count; ++I)
121  OW->write8(7);
122  return true;
123 }
124 
126  const MCSubtargetInfo &STI,
127  const MCRegisterInfo &MRI,
128  const MCTargetOptions &Options) {
129  uint8_t OSABI =
131  return new SystemZMCAsmBackend(OSABI);
132 }
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
This represents an "assembler immediate".
Definition: MCValue.h:40
OSType getOS() const
getOS - Get the parsed operating system type of this triple.
Definition: Triple.h:294
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
Defines the object file and target independent interfaces used by the assembler backend to write nati...
void write8(uint8_t Value)
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:66
const Triple & getTargetTriple() const
getTargetTriple - Return the target triple string.
Is this fixup kind PCrelative? This is used by the assembler backend to evaluate fixup values in a ta...
Encapsulates the layout of an assembly file at a particular point in time.
Definition: MCAsmLayout.h:29
std::unique_ptr< MCObjectWriter > createSystemZObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI)
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:159
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:257
unsigned const MachineRegisterInfo * MRI
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:291
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:149
MCFixupKind
Extensible enumeration to represent the type of a fixup.
Definition: MCFixup.h:23
uint32_t getOffset() const
Definition: MCFixup.h:95
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
PowerPC TLS Dynamic Call Fixup
Target - Wrapper for Target specific information.
static uint64_t extractBitsForFixup(MCFixupKind Kind, uint64_t Value)
MCAsmBackend * createSystemZMCAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
#define I(x, y, z)
Definition: MD5.cpp:58
MCSubtargetInfo - Generic base class for all target subtargets.
Target independent information on a fixup kind.
An abstract base class for streams implementations that also support a pwrite operation.
Definition: raw_ostream.h:337
const unsigned Kind
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
Definition: Value.h:73
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:40
constexpr char Size[]
Key for Kernel::Arg::Metadata::mSize.
MCFixupKind getKind() const
Definition: MCFixup.h:93