You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,3 +0,0 @@
|
||||
add_llvm_library(LLVMSystemZAsmParser
|
||||
SystemZAsmParser.cpp
|
||||
)
|
@ -1,23 +0,0 @@
|
||||
;===- ./lib/Target/SystemZ/AsmParser/LLVMBuild.txt -------------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
name = SystemZAsmParser
|
||||
parent = SystemZ
|
||||
required_libraries = MC MCParser Support SystemZDesc SystemZInfo
|
||||
add_to_library_groups = SystemZ
|
File diff suppressed because it is too large
Load Diff
43
external/llvm/lib/Target/SystemZ/CMakeLists.txt
vendored
43
external/llvm/lib/Target/SystemZ/CMakeLists.txt
vendored
@ -1,43 +0,0 @@
|
||||
set(LLVM_TARGET_DEFINITIONS SystemZ.td)
|
||||
|
||||
tablegen(LLVM SystemZGenAsmMatcher.inc -gen-asm-matcher)
|
||||
tablegen(LLVM SystemZGenAsmWriter.inc -gen-asm-writer)
|
||||
tablegen(LLVM SystemZGenCallingConv.inc -gen-callingconv)
|
||||
tablegen(LLVM SystemZGenDAGISel.inc -gen-dag-isel)
|
||||
tablegen(LLVM SystemZGenDisassemblerTables.inc -gen-disassembler)
|
||||
tablegen(LLVM SystemZGenMCCodeEmitter.inc -gen-emitter)
|
||||
tablegen(LLVM SystemZGenInstrInfo.inc -gen-instr-info)
|
||||
tablegen(LLVM SystemZGenRegisterInfo.inc -gen-register-info)
|
||||
tablegen(LLVM SystemZGenSubtargetInfo.inc -gen-subtarget)
|
||||
add_public_tablegen_target(SystemZCommonTableGen)
|
||||
|
||||
add_llvm_target(SystemZCodeGen
|
||||
SystemZAsmPrinter.cpp
|
||||
SystemZCallingConv.cpp
|
||||
SystemZConstantPoolValue.cpp
|
||||
SystemZElimCompare.cpp
|
||||
SystemZExpandPseudo.cpp
|
||||
SystemZFrameLowering.cpp
|
||||
SystemZHazardRecognizer.cpp
|
||||
SystemZISelDAGToDAG.cpp
|
||||
SystemZISelLowering.cpp
|
||||
SystemZInstrInfo.cpp
|
||||
SystemZLDCleanup.cpp
|
||||
SystemZLongBranch.cpp
|
||||
SystemZMachineFunctionInfo.cpp
|
||||
SystemZMachineScheduler.cpp
|
||||
SystemZMCInstLower.cpp
|
||||
SystemZRegisterInfo.cpp
|
||||
SystemZSelectionDAGInfo.cpp
|
||||
SystemZShortenInst.cpp
|
||||
SystemZSubtarget.cpp
|
||||
SystemZTargetMachine.cpp
|
||||
SystemZTargetTransformInfo.cpp
|
||||
SystemZTDC.cpp
|
||||
)
|
||||
|
||||
add_subdirectory(AsmParser)
|
||||
add_subdirectory(Disassembler)
|
||||
add_subdirectory(InstPrinter)
|
||||
add_subdirectory(TargetInfo)
|
||||
add_subdirectory(MCTargetDesc)
|
@ -1,3 +0,0 @@
|
||||
add_llvm_library(LLVMSystemZDisassembler
|
||||
SystemZDisassembler.cpp
|
||||
)
|
@ -1,23 +0,0 @@
|
||||
;===-- ./lib/Target/SystemZ/Disassembler/LLVMBuild.txt ---------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
name = SystemZDisassembler
|
||||
parent = SystemZ
|
||||
required_libraries = MC MCDisassembler Support SystemZDesc SystemZInfo
|
||||
add_to_library_groups = SystemZ
|
@ -1,482 +0,0 @@
|
||||
//===-- SystemZDisassembler.cpp - Disassembler for SystemZ ------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
||||
#include "SystemZ.h"
|
||||
#include "llvm/MC/MCDisassembler/MCDisassembler.h"
|
||||
#include "llvm/MC/MCFixedLenDisassembler.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "systemz-disassembler"
|
||||
|
||||
typedef MCDisassembler::DecodeStatus DecodeStatus;
|
||||
|
||||
namespace {
|
||||
|
||||
class SystemZDisassembler : public MCDisassembler {
|
||||
public:
|
||||
SystemZDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
|
||||
: MCDisassembler(STI, Ctx) {}
|
||||
~SystemZDisassembler() override = default;
|
||||
|
||||
DecodeStatus getInstruction(MCInst &instr, uint64_t &Size,
|
||||
ArrayRef<uint8_t> Bytes, uint64_t Address,
|
||||
raw_ostream &VStream,
|
||||
raw_ostream &CStream) const override;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
static MCDisassembler *createSystemZDisassembler(const Target &T,
|
||||
const MCSubtargetInfo &STI,
|
||||
MCContext &Ctx) {
|
||||
return new SystemZDisassembler(STI, Ctx);
|
||||
}
|
||||
|
||||
extern "C" void LLVMInitializeSystemZDisassembler() {
|
||||
// Register the disassembler.
|
||||
TargetRegistry::RegisterMCDisassembler(getTheSystemZTarget(),
|
||||
createSystemZDisassembler);
|
||||
}
|
||||
|
||||
/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
|
||||
/// immediate Value in the MCInst.
|
||||
///
|
||||
/// @param Value - The immediate Value, has had any PC adjustment made by
|
||||
/// the caller.
|
||||
/// @param isBranch - If the instruction is a branch instruction
|
||||
/// @param Address - The starting address of the instruction
|
||||
/// @param Offset - The byte offset to this immediate in the instruction
|
||||
/// @param Width - The byte width of this immediate in the instruction
|
||||
///
|
||||
/// If the getOpInfo() function was set when setupForSymbolicDisassembly() was
|
||||
/// called then that function is called to get any symbolic information for the
|
||||
/// immediate in the instruction using the Address, Offset and Width. If that
|
||||
/// returns non-zero then the symbolic information it returns is used to create
|
||||
/// an MCExpr and that is added as an operand to the MCInst. If getOpInfo()
|
||||
/// returns zero and isBranch is true then a symbol look up for immediate Value
|
||||
/// is done and if a symbol is found an MCExpr is created with that, else
|
||||
/// an MCExpr with the immediate Value is created. This function returns true
|
||||
/// if it adds an operand to the MCInst and false otherwise.
|
||||
static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
|
||||
uint64_t Address, uint64_t Offset,
|
||||
uint64_t Width, MCInst &MI,
|
||||
const void *Decoder) {
|
||||
const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
|
||||
return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch,
|
||||
Offset, Width);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
const unsigned *Regs, unsigned Size) {
|
||||
assert(RegNo < Size && "Invalid register");
|
||||
RegNo = Regs[RegNo];
|
||||
if (RegNo == 0)
|
||||
return MCDisassembler::Fail;
|
||||
Inst.addOperand(MCOperand::createReg(RegNo));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGR32BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::GR32Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGRH32BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::GRH32Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGR64BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::GR64Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGR128BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::GR128Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeADDR64BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::GR64Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeFP32BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::FP32Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeFP64BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::FP64Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeFP128BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::FP128Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVR32BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::VR32Regs, 32);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVR64BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::VR64Regs, 32);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVR128BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::VR128Regs, 32);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeAR32BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::AR32Regs, 16);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeCR64BitRegisterClass(MCInst &Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeRegisterClass(Inst, RegNo, SystemZMC::CR64Regs, 16);
|
||||
}
|
||||
|
||||
template<unsigned N>
|
||||
static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm) {
|
||||
if (!isUInt<N>(Imm))
|
||||
return MCDisassembler::Fail;
|
||||
Inst.addOperand(MCOperand::createImm(Imm));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
template<unsigned N>
|
||||
static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm) {
|
||||
if (!isUInt<N>(Imm))
|
||||
return MCDisassembler::Fail;
|
||||
Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm)));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU1ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<1>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU2ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<2>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU3ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<3>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU4ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<4>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU6ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<6>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU8ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<8>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU12ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<12>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU16ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<16>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeU32ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeUImmOperand<32>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeS8ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeSImmOperand<8>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeS16ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeSImmOperand<16>(Inst, Imm);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeS32ImmOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
return decodeSImmOperand<32>(Inst, Imm);
|
||||
}
|
||||
|
||||
template<unsigned N>
|
||||
static DecodeStatus decodePCDBLOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
bool isBranch,
|
||||
const void *Decoder) {
|
||||
assert(isUInt<N>(Imm) && "Invalid PC-relative offset");
|
||||
uint64_t Value = SignExtend64<N>(Imm) * 2 + Address;
|
||||
|
||||
if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, N / 8,
|
||||
Inst, Decoder))
|
||||
Inst.addOperand(MCOperand::createImm(Value));
|
||||
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodePC12DBLBranchOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodePCDBLOperand<12>(Inst, Imm, Address, true, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodePC16DBLBranchOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodePCDBLOperand<16>(Inst, Imm, Address, true, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodePC24DBLBranchOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodePCDBLOperand<24>(Inst, Imm, Address, true, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodePC32DBLBranchOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodePCDBLOperand<32>(Inst, Imm, Address, true, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodePC32DBLOperand(MCInst &Inst, uint64_t Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodePCDBLOperand<32>(Inst, Imm, Address, false, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr12Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Base = Field >> 12;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Base < 16 && "Invalid BDAddr12");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr20Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Base = Field >> 20;
|
||||
uint64_t Disp = ((Field << 12) & 0xff000) | ((Field >> 8) & 0xfff);
|
||||
assert(Base < 16 && "Invalid BDAddr20");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(SignExtend64<20>(Disp)));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDXAddr12Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Index = Field >> 16;
|
||||
uint64_t Base = (Field >> 12) & 0xf;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Index < 16 && "Invalid BDXAddr12");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
Inst.addOperand(MCOperand::createReg(Index == 0 ? 0 : Regs[Index]));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDXAddr20Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Index = Field >> 24;
|
||||
uint64_t Base = (Field >> 20) & 0xf;
|
||||
uint64_t Disp = ((Field & 0xfff00) >> 8) | ((Field & 0xff) << 12);
|
||||
assert(Index < 16 && "Invalid BDXAddr20");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(SignExtend64<20>(Disp)));
|
||||
Inst.addOperand(MCOperand::createReg(Index == 0 ? 0 : Regs[Index]));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDLAddr12Len4Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Length = Field >> 16;
|
||||
uint64_t Base = (Field >> 12) & 0xf;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Length < 16 && "Invalid BDLAddr12Len4");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
Inst.addOperand(MCOperand::createImm(Length + 1));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDLAddr12Len8Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Length = Field >> 16;
|
||||
uint64_t Base = (Field >> 12) & 0xf;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Length < 256 && "Invalid BDLAddr12Len8");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
Inst.addOperand(MCOperand::createImm(Length + 1));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDRAddr12Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Length = Field >> 16;
|
||||
uint64_t Base = (Field >> 12) & 0xf;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Length < 16 && "Invalid BDRAddr12");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
Inst.addOperand(MCOperand::createReg(Regs[Length]));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDVAddr12Operand(MCInst &Inst, uint64_t Field,
|
||||
const unsigned *Regs) {
|
||||
uint64_t Index = Field >> 16;
|
||||
uint64_t Base = (Field >> 12) & 0xf;
|
||||
uint64_t Disp = Field & 0xfff;
|
||||
assert(Index < 32 && "Invalid BDVAddr12");
|
||||
Inst.addOperand(MCOperand::createReg(Base == 0 ? 0 : Regs[Base]));
|
||||
Inst.addOperand(MCOperand::createImm(Disp));
|
||||
Inst.addOperand(MCOperand::createReg(SystemZMC::VR128Regs[Index]));
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr32Disp12Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDAddr12Operand(Inst, Field, SystemZMC::GR32Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr32Disp20Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDAddr20Operand(Inst, Field, SystemZMC::GR32Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr64Disp12Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDAddr12Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDAddr64Disp20Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDAddr20Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDXAddr64Disp12Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDXAddr12Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDXAddr64Disp20Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDXAddr20Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDLAddr64Disp12Len4Operand(MCInst &Inst,
|
||||
uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDLAddr12Len4Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDLAddr64Disp12Len8Operand(MCInst &Inst,
|
||||
uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDLAddr12Len8Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDRAddr64Disp12Operand(MCInst &Inst,
|
||||
uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDRAddr12Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeBDVAddr64Disp12Operand(MCInst &Inst, uint64_t Field,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
return decodeBDVAddr12Operand(Inst, Field, SystemZMC::GR64Regs);
|
||||
}
|
||||
|
||||
#include "SystemZGenDisassemblerTables.inc"
|
||||
|
||||
DecodeStatus SystemZDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
|
||||
ArrayRef<uint8_t> Bytes,
|
||||
uint64_t Address,
|
||||
raw_ostream &OS,
|
||||
raw_ostream &CS) const {
|
||||
// Get the first two bytes of the instruction.
|
||||
Size = 0;
|
||||
if (Bytes.size() < 2)
|
||||
return MCDisassembler::Fail;
|
||||
|
||||
// The top 2 bits of the first byte specify the size.
|
||||
const uint8_t *Table;
|
||||
if (Bytes[0] < 0x40) {
|
||||
Size = 2;
|
||||
Table = DecoderTable16;
|
||||
} else if (Bytes[0] < 0xc0) {
|
||||
Size = 4;
|
||||
Table = DecoderTable32;
|
||||
} else {
|
||||
Size = 6;
|
||||
Table = DecoderTable48;
|
||||
}
|
||||
|
||||
// Read any remaining bytes.
|
||||
if (Bytes.size() < Size)
|
||||
return MCDisassembler::Fail;
|
||||
|
||||
// Construct the instruction.
|
||||
uint64_t Inst = 0;
|
||||
for (uint64_t I = 0; I < Size; ++I)
|
||||
Inst = (Inst << 8) | Bytes[I];
|
||||
|
||||
return decodeInstruction(Table, MI, Inst, Address, this, STI);
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
add_llvm_library(LLVMSystemZAsmPrinter
|
||||
SystemZInstPrinter.cpp
|
||||
)
|
@ -1,23 +0,0 @@
|
||||
;===- ./lib/Target/SystemZ/InstPrinter/LLVMBuild.txt -----------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
name = SystemZAsmPrinter
|
||||
parent = SystemZ
|
||||
required_libraries = MC Support
|
||||
add_to_library_groups = SystemZ
|
@ -1,234 +0,0 @@
|
||||
//===- SystemZInstPrinter.cpp - Convert SystemZ MCInst to assembly syntax -===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "SystemZInstPrinter.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "asm-printer"
|
||||
|
||||
#include "SystemZGenAsmWriter.inc"
|
||||
|
||||
void SystemZInstPrinter::printAddress(unsigned Base, int64_t Disp,
|
||||
unsigned Index, raw_ostream &O) {
|
||||
O << Disp;
|
||||
if (Base || Index) {
|
||||
O << '(';
|
||||
if (Index) {
|
||||
O << '%' << getRegisterName(Index);
|
||||
if (Base)
|
||||
O << ',';
|
||||
}
|
||||
if (Base)
|
||||
O << '%' << getRegisterName(Base);
|
||||
O << ')';
|
||||
}
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printOperand(const MCOperand &MO, const MCAsmInfo *MAI,
|
||||
raw_ostream &O) {
|
||||
if (MO.isReg())
|
||||
O << '%' << getRegisterName(MO.getReg());
|
||||
else if (MO.isImm())
|
||||
O << MO.getImm();
|
||||
else if (MO.isExpr())
|
||||
MO.getExpr()->print(O, MAI);
|
||||
else
|
||||
llvm_unreachable("Invalid operand");
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
|
||||
StringRef Annot,
|
||||
const MCSubtargetInfo &STI) {
|
||||
printInstruction(MI, O);
|
||||
printAnnotation(O, Annot);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printRegName(raw_ostream &O, unsigned RegNo) const {
|
||||
O << '%' << getRegisterName(RegNo);
|
||||
}
|
||||
|
||||
template <unsigned N>
|
||||
static void printUImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {
|
||||
int64_t Value = MI->getOperand(OpNum).getImm();
|
||||
assert(isUInt<N>(Value) && "Invalid uimm argument");
|
||||
O << Value;
|
||||
}
|
||||
|
||||
template <unsigned N>
|
||||
static void printSImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {
|
||||
int64_t Value = MI->getOperand(OpNum).getImm();
|
||||
assert(isInt<N>(Value) && "Invalid simm argument");
|
||||
O << Value;
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU1ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<1>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU2ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<2>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU3ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<3>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU4ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<4>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU6ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<6>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printS8ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printSImmOperand<8>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU8ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<8>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU12ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<12>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printS16ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printSImmOperand<16>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU16ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<16>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printS32ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printSImmOperand<32>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU32ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<32>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printU48ImmOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printUImmOperand<48>(MI, OpNum, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printPCRelOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
const MCOperand &MO = MI->getOperand(OpNum);
|
||||
if (MO.isImm()) {
|
||||
O << "0x";
|
||||
O.write_hex(MO.getImm());
|
||||
} else
|
||||
MO.getExpr()->print(O, &MAI);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printPCRelTLSOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
// Output the PC-relative operand.
|
||||
printPCRelOperand(MI, OpNum, O);
|
||||
|
||||
// Output the TLS marker if present.
|
||||
if ((unsigned)OpNum + 1 < MI->getNumOperands()) {
|
||||
const MCOperand &MO = MI->getOperand(OpNum + 1);
|
||||
const MCSymbolRefExpr &refExp = cast<MCSymbolRefExpr>(*MO.getExpr());
|
||||
switch (refExp.getKind()) {
|
||||
case MCSymbolRefExpr::VK_TLSGD:
|
||||
O << ":tls_gdcall:";
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_TLSLDM:
|
||||
O << ":tls_ldcall:";
|
||||
break;
|
||||
default:
|
||||
llvm_unreachable("Unexpected symbol kind");
|
||||
}
|
||||
O << refExp.getSymbol().getName();
|
||||
}
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printOperand(MI->getOperand(OpNum), &MAI, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printBDAddrOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printAddress(MI->getOperand(OpNum).getReg(),
|
||||
MI->getOperand(OpNum + 1).getImm(), 0, O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printBDXAddrOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printAddress(MI->getOperand(OpNum).getReg(),
|
||||
MI->getOperand(OpNum + 1).getImm(),
|
||||
MI->getOperand(OpNum + 2).getReg(), O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printBDLAddrOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
unsigned Base = MI->getOperand(OpNum).getReg();
|
||||
uint64_t Disp = MI->getOperand(OpNum + 1).getImm();
|
||||
uint64_t Length = MI->getOperand(OpNum + 2).getImm();
|
||||
O << Disp << '(' << Length;
|
||||
if (Base)
|
||||
O << ",%" << getRegisterName(Base);
|
||||
O << ')';
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printBDRAddrOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
unsigned Base = MI->getOperand(OpNum).getReg();
|
||||
uint64_t Disp = MI->getOperand(OpNum + 1).getImm();
|
||||
unsigned Length = MI->getOperand(OpNum + 2).getReg();
|
||||
O << Disp << "(%" << getRegisterName(Length);
|
||||
if (Base)
|
||||
O << ",%" << getRegisterName(Base);
|
||||
O << ')';
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printBDVAddrOperand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
printAddress(MI->getOperand(OpNum).getReg(),
|
||||
MI->getOperand(OpNum + 1).getImm(),
|
||||
MI->getOperand(OpNum + 2).getReg(), O);
|
||||
}
|
||||
|
||||
void SystemZInstPrinter::printCond4Operand(const MCInst *MI, int OpNum,
|
||||
raw_ostream &O) {
|
||||
static const char *const CondNames[] = {
|
||||
"o", "h", "nle", "l", "nhe", "lh", "ne",
|
||||
"e", "nlh", "he", "nl", "le", "nh", "no"
|
||||
};
|
||||
uint64_t Imm = MI->getOperand(OpNum).getImm();
|
||||
assert(Imm > 0 && Imm < 15 && "Invalid condition");
|
||||
O << CondNames[Imm - 1];
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
//==- SystemZInstPrinter.h - Convert SystemZ MCInst to assembly --*- C++ -*-==//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This class prints a SystemZ MCInst to a .s file.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_SYSTEMZ_INSTPRINTER_SYSTEMZINSTPRINTER_H
|
||||
#define LLVM_LIB_TARGET_SYSTEMZ_INSTPRINTER_SYSTEMZINSTPRINTER_H
|
||||
|
||||
#include "llvm/MC/MCInstPrinter.h"
|
||||
#include <cstdint>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MCOperand;
|
||||
|
||||
class SystemZInstPrinter : public MCInstPrinter {
|
||||
public:
|
||||
SystemZInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
|
||||
const MCRegisterInfo &MRI)
|
||||
: MCInstPrinter(MAI, MII, MRI) {}
|
||||
|
||||
// Automatically generated by tblgen.
|
||||
void printInstruction(const MCInst *MI, raw_ostream &O);
|
||||
static const char *getRegisterName(unsigned RegNo);
|
||||
|
||||
// Print an address with the given base, displacement and index.
|
||||
static void printAddress(unsigned Base, int64_t Disp, unsigned Index,
|
||||
raw_ostream &O);
|
||||
|
||||
// Print the given operand.
|
||||
static void printOperand(const MCOperand &MO, const MCAsmInfo *MAI,
|
||||
raw_ostream &O);
|
||||
|
||||
// Override MCInstPrinter.
|
||||
void printRegName(raw_ostream &O, unsigned RegNo) const override;
|
||||
void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
|
||||
const MCSubtargetInfo &STI) override;
|
||||
|
||||
private:
|
||||
// Print various types of operand.
|
||||
void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printBDAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printBDXAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printBDLAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printBDRAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printBDVAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU1ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU2ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU3ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU4ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU6ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printS8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU12ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printS16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printS32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printU48ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printPCRelOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
void printPCRelTLSOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
|
||||
// Print the mnemonic for a condition-code mask ("ne", "lh", etc.)
|
||||
// This forms part of the instruction name rather than the operand list.
|
||||
void printCond4Operand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_LIB_TARGET_SYSTEMZ_INSTPRINTER_SYSTEMZINSTPRINTER_H
|
35
external/llvm/lib/Target/SystemZ/LLVMBuild.txt
vendored
35
external/llvm/lib/Target/SystemZ/LLVMBuild.txt
vendored
@ -1,35 +0,0 @@
|
||||
;===- ./lib/Target/SystemZ/LLVMBuild.txt -----------------------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[common]
|
||||
subdirectories = AsmParser Disassembler InstPrinter MCTargetDesc TargetInfo
|
||||
|
||||
[component_0]
|
||||
type = TargetGroup
|
||||
name = SystemZ
|
||||
parent = Target
|
||||
has_asmparser = 1
|
||||
has_asmprinter = 1
|
||||
has_disassembler = 1
|
||||
has_jit = 1
|
||||
|
||||
[component_1]
|
||||
type = Library
|
||||
name = SystemZCodeGen
|
||||
parent = SystemZ
|
||||
required_libraries = Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support SystemZAsmPrinter SystemZDesc SystemZInfo Target
|
||||
add_to_library_groups = SystemZ
|
@ -1,7 +0,0 @@
|
||||
add_llvm_library(LLVMSystemZDesc
|
||||
SystemZMCAsmBackend.cpp
|
||||
SystemZMCAsmInfo.cpp
|
||||
SystemZMCCodeEmitter.cpp
|
||||
SystemZMCObjectWriter.cpp
|
||||
SystemZMCTargetDesc.cpp
|
||||
)
|
@ -1,23 +0,0 @@
|
||||
;===- ./lib/Target/SystemZ/MCTargetDesc/LLVMBuild.txt ----------*- Conf -*--===;
|
||||
;
|
||||
; The LLVM Compiler Infrastructure
|
||||
;
|
||||
; This file is distributed under the University of Illinois Open Source
|
||||
; License. See LICENSE.TXT for details.
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
;
|
||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||
;
|
||||
; For more information on the LLVMBuild system, please see:
|
||||
;
|
||||
; http://llvm.org/docs/LLVMBuild.html
|
||||
;
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
name = SystemZDesc
|
||||
parent = SystemZ
|
||||
required_libraries = MC Support SystemZAsmPrinter SystemZInfo
|
||||
add_to_library_groups = SystemZ
|
@ -1,132 +0,0 @@
|
||||
//===-- SystemZMCAsmBackend.cpp - SystemZ assembler backend ---------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/SystemZMCFixups.h"
|
||||
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
||||
#include "llvm/MC/MCAsmBackend.h"
|
||||
#include "llvm/MC/MCELFObjectWriter.h"
|
||||
#include "llvm/MC/MCFixupKindInfo.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
// Value is a fully-resolved relocation value: Symbol + Addend [- Pivot].
|
||||
// Return the bits that should be installed in a relocation field for
|
||||
// fixup kind Kind.
|
||||
static uint64_t extractBitsForFixup(MCFixupKind Kind, uint64_t Value) {
|
||||
if (Kind < FirstTargetFixupKind)
|
||||
return Value;
|
||||
|
||||
switch (unsigned(Kind)) {
|
||||
case SystemZ::FK_390_PC12DBL:
|
||||
case SystemZ::FK_390_PC16DBL:
|
||||
case SystemZ::FK_390_PC24DBL:
|
||||
case SystemZ::FK_390_PC32DBL:
|
||||
return (int64_t)Value / 2;
|
||||
|
||||
case SystemZ::FK_390_TLS_CALL:
|
||||
return 0;
|
||||
}
|
||||
|
||||
llvm_unreachable("Unknown fixup kind!");
|
||||
}
|
||||
|
||||
namespace {
|
||||
class SystemZMCAsmBackend : public MCAsmBackend {
|
||||
uint8_t OSABI;
|
||||
public:
|
||||
SystemZMCAsmBackend(uint8_t osABI)
|
||||
: OSABI(osABI) {}
|
||||
|
||||
// Override MCAsmBackend
|
||||
unsigned getNumFixupKinds() const override {
|
||||
return SystemZ::NumTargetFixupKinds;
|
||||
}
|
||||
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
|
||||
void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
|
||||
const MCValue &Target, MutableArrayRef<char> Data,
|
||||
uint64_t Value, bool IsResolved) const override;
|
||||
bool mayNeedRelaxation(const MCInst &Inst) const override {
|
||||
return false;
|
||||
}
|
||||
bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
|
||||
const MCRelaxableFragment *Fragment,
|
||||
const MCAsmLayout &Layout) const override {
|
||||
return false;
|
||||
}
|
||||
void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
|
||||
MCInst &Res) const override {
|
||||
llvm_unreachable("SystemZ does do not have assembler relaxation");
|
||||
}
|
||||
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override;
|
||||
std::unique_ptr<MCObjectWriter>
|
||||
createObjectWriter(raw_pwrite_stream &OS) const override {
|
||||
return createSystemZObjectWriter(OS, OSABI);
|
||||
}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
const MCFixupKindInfo &
|
||||
SystemZMCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
|
||||
const static MCFixupKindInfo Infos[SystemZ::NumTargetFixupKinds] = {
|
||||
{ "FK_390_PC12DBL", 4, 12, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "FK_390_PC16DBL", 0, 16, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "FK_390_PC24DBL", 0, 24, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "FK_390_PC32DBL", 0, 32, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "FK_390_TLS_CALL", 0, 0, 0 }
|
||||
};
|
||||
|
||||
if (Kind < FirstTargetFixupKind)
|
||||
return MCAsmBackend::getFixupKindInfo(Kind);
|
||||
|
||||
assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
|
||||
"Invalid kind!");
|
||||
return Infos[Kind - FirstTargetFixupKind];
|
||||
}
|
||||
|
||||
void SystemZMCAsmBackend::applyFixup(const MCAssembler &Asm,
|
||||
const MCFixup &Fixup,
|
||||
const MCValue &Target,
|
||||
MutableArrayRef<char> Data, uint64_t Value,
|
||||
bool IsResolved) const {
|
||||
MCFixupKind Kind = Fixup.getKind();
|
||||
unsigned Offset = Fixup.getOffset();
|
||||
unsigned BitSize = getFixupKindInfo(Kind).TargetSize;
|
||||
unsigned Size = (BitSize + 7) / 8;
|
||||
|
||||
assert(Offset + Size <= Data.size() && "Invalid fixup offset!");
|
||||
|
||||
// Big-endian insertion of Size bytes.
|
||||
Value = extractBitsForFixup(Kind, Value);
|
||||
if (BitSize < 64)
|
||||
Value &= ((uint64_t)1 << BitSize) - 1;
|
||||
unsigned ShiftValue = (Size * 8) - 8;
|
||||
for (unsigned I = 0; I != Size; ++I) {
|
||||
Data[Offset + I] |= uint8_t(Value >> ShiftValue);
|
||||
ShiftValue -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
bool SystemZMCAsmBackend::writeNopData(uint64_t Count,
|
||||
MCObjectWriter *OW) const {
|
||||
for (uint64_t I = 0; I != Count; ++I)
|
||||
OW->write8(7);
|
||||
return true;
|
||||
}
|
||||
|
||||
MCAsmBackend *llvm::createSystemZMCAsmBackend(const Target &T,
|
||||
const MCSubtargetInfo &STI,
|
||||
const MCRegisterInfo &MRI,
|
||||
const MCTargetOptions &Options) {
|
||||
uint8_t OSABI =
|
||||
MCELFObjectTargetWriter::getOSABI(STI.getTargetTriple().getOS());
|
||||
return new SystemZMCAsmBackend(OSABI);
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
//===-- SystemZMCAsmInfo.cpp - SystemZ asm properties ---------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "SystemZMCAsmInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
SystemZMCAsmInfo::SystemZMCAsmInfo(const Triple &TT) {
|
||||
CodePointerSize = 8;
|
||||
CalleeSaveStackSlotSize = 8;
|
||||
IsLittleEndian = false;
|
||||
|
||||
CommentString = "#";
|
||||
ZeroDirective = "\t.space\t";
|
||||
Data64bitsDirective = "\t.quad\t";
|
||||
UsesELFSectionDirectiveForBSS = true;
|
||||
SupportsDebugInformation = true;
|
||||
ExceptionsType = ExceptionHandling::DwarfCFI;
|
||||
|
||||
UseIntegratedAssembler = true;
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
//====-- SystemZMCAsmInfo.h - SystemZ asm properties -----------*- C++ -*--===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCASMINFO_H
|
||||
#define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCASMINFO_H
|
||||
|
||||
#include "llvm/MC/MCAsmInfoELF.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace llvm {
|
||||
class Triple;
|
||||
|
||||
class SystemZMCAsmInfo : public MCAsmInfoELF {
|
||||
public:
|
||||
explicit SystemZMCAsmInfo(const Triple &TT);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -1,307 +0,0 @@
|
||||
//===-- SystemZMCCodeEmitter.cpp - Convert SystemZ code to machine code ---===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the SystemZMCCodeEmitter class.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/SystemZMCFixups.h"
|
||||
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/MC/MCCodeEmitter.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCFixup.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "mccodeemitter"
|
||||
|
||||
namespace {
|
||||
|
||||
class SystemZMCCodeEmitter : public MCCodeEmitter {
|
||||
const MCInstrInfo &MCII;
|
||||
MCContext &Ctx;
|
||||
|
||||
public:
|
||||
SystemZMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx)
|
||||
: MCII(mcii), Ctx(ctx) {
|
||||
}
|
||||
|
||||
~SystemZMCCodeEmitter() override = default;
|
||||
|
||||
// OVerride MCCodeEmitter.
|
||||
void encodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const override;
|
||||
|
||||
private:
|
||||
// Automatically generated by TableGen.
|
||||
uint64_t getBinaryCodeForInstr(const MCInst &MI,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
// Called by the TableGen code to get the binary encoding of operand
|
||||
// MO in MI. Fixups is the list of fixups against MI.
|
||||
uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
// Called by the TableGen code to get the binary encoding of an address.
|
||||
// The index or length, if any, is encoded first, followed by the base,
|
||||
// followed by the displacement. In a 20-bit displacement,
|
||||
// the low 12 bits are encoded before the high 8 bits.
|
||||
uint64_t getBDAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDAddr20Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDXAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDXAddr20Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDLAddr12Len4Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDLAddr12Len8Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDRAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getBDVAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
// Operand OpNum of MI needs a PC-relative fixup of kind Kind at
|
||||
// Offset bytes from the start of MI. Add the fixup to Fixups
|
||||
// and return the in-place addend, which since we're a RELA target
|
||||
// is always 0. If AllowTLS is true and optional operand OpNum + 1
|
||||
// is present, also emit a TLS call fixup for it.
|
||||
uint64_t getPCRelEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
unsigned Kind, int64_t Offset,
|
||||
bool AllowTLS) const;
|
||||
|
||||
uint64_t getPC16DBLEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC16DBL, 2, false);
|
||||
}
|
||||
uint64_t getPC32DBLEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC32DBL, 2, false);
|
||||
}
|
||||
uint64_t getPC16DBLTLSEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC16DBL, 2, true);
|
||||
}
|
||||
uint64_t getPC32DBLTLSEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC32DBL, 2, true);
|
||||
}
|
||||
uint64_t getPC12DBLBPPEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC12DBL, 1, false);
|
||||
}
|
||||
uint64_t getPC16DBLBPPEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC16DBL, 4, false);
|
||||
}
|
||||
uint64_t getPC24DBLBPPEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getPCRelEncoding(MI, OpNum, Fixups,
|
||||
SystemZ::FK_390_PC24DBL, 3, false);
|
||||
}
|
||||
|
||||
private:
|
||||
uint64_t computeAvailableFeatures(const FeatureBitset &FB) const;
|
||||
void verifyInstructionPredicates(const MCInst &MI,
|
||||
uint64_t AvailableFeatures) const;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
void SystemZMCCodeEmitter::
|
||||
encodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
verifyInstructionPredicates(MI,
|
||||
computeAvailableFeatures(STI.getFeatureBits()));
|
||||
|
||||
uint64_t Bits = getBinaryCodeForInstr(MI, Fixups, STI);
|
||||
unsigned Size = MCII.get(MI.getOpcode()).getSize();
|
||||
// Big-endian insertion of Size bytes.
|
||||
unsigned ShiftValue = (Size * 8) - 8;
|
||||
for (unsigned I = 0; I != Size; ++I) {
|
||||
OS << uint8_t(Bits >> ShiftValue);
|
||||
ShiftValue -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
if (MO.isReg())
|
||||
return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg());
|
||||
if (MO.isImm())
|
||||
return static_cast<uint64_t>(MO.getImm());
|
||||
llvm_unreachable("Unexpected operand type!");
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp));
|
||||
return (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDAddr20Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isInt<20>(Disp));
|
||||
return (Base << 20) | ((Disp & 0xfff) << 8) | ((Disp & 0xff000) >> 12);
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDXAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Index = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<4>(Index));
|
||||
return (Index << 16) | (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDXAddr20Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Index = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isInt<20>(Disp) && isUInt<4>(Index));
|
||||
return (Index << 24) | (Base << 20) | ((Disp & 0xfff) << 8)
|
||||
| ((Disp & 0xff000) >> 12);
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDLAddr12Len4Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Len = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI) - 1;
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<4>(Len));
|
||||
return (Len << 16) | (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDLAddr12Len8Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Len = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI) - 1;
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<8>(Len));
|
||||
return (Len << 16) | (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDRAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Len = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<4>(Len));
|
||||
return (Len << 16) | (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t SystemZMCCodeEmitter::
|
||||
getBDVAddr12Encoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t Base = getMachineOpValue(MI, MI.getOperand(OpNum), Fixups, STI);
|
||||
uint64_t Disp = getMachineOpValue(MI, MI.getOperand(OpNum + 1), Fixups, STI);
|
||||
uint64_t Index = getMachineOpValue(MI, MI.getOperand(OpNum + 2), Fixups, STI);
|
||||
assert(isUInt<4>(Base) && isUInt<12>(Disp) && isUInt<5>(Index));
|
||||
return (Index << 16) | (Base << 12) | Disp;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
SystemZMCCodeEmitter::getPCRelEncoding(const MCInst &MI, unsigned OpNum,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
unsigned Kind, int64_t Offset,
|
||||
bool AllowTLS) const {
|
||||
const MCOperand &MO = MI.getOperand(OpNum);
|
||||
const MCExpr *Expr;
|
||||
if (MO.isImm())
|
||||
Expr = MCConstantExpr::create(MO.getImm() + Offset, Ctx);
|
||||
else {
|
||||
Expr = MO.getExpr();
|
||||
if (Offset) {
|
||||
// The operand value is relative to the start of MI, but the fixup
|
||||
// is relative to the operand field itself, which is Offset bytes
|
||||
// into MI. Add Offset to the relocation value to cancel out
|
||||
// this difference.
|
||||
const MCExpr *OffsetExpr = MCConstantExpr::create(Offset, Ctx);
|
||||
Expr = MCBinaryExpr::createAdd(Expr, OffsetExpr, Ctx);
|
||||
}
|
||||
}
|
||||
Fixups.push_back(MCFixup::create(Offset, Expr, (MCFixupKind)Kind));
|
||||
|
||||
// Output the fixup for the TLS marker if present.
|
||||
if (AllowTLS && OpNum + 1 < MI.getNumOperands()) {
|
||||
const MCOperand &MOTLS = MI.getOperand(OpNum + 1);
|
||||
Fixups.push_back(MCFixup::create(0, MOTLS.getExpr(),
|
||||
(MCFixupKind)SystemZ::FK_390_TLS_CALL));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define ENABLE_INSTR_PREDICATE_VERIFIER
|
||||
#include "SystemZGenMCCodeEmitter.inc"
|
||||
|
||||
MCCodeEmitter *llvm::createSystemZMCCodeEmitter(const MCInstrInfo &MCII,
|
||||
const MCRegisterInfo &MRI,
|
||||
MCContext &Ctx) {
|
||||
return new SystemZMCCodeEmitter(MCII, Ctx);
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
//===-- SystemZMCFixups.h - SystemZ-specific fixup entries ------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCFIXUPS_H
|
||||
#define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCFIXUPS_H
|
||||
|
||||
#include "llvm/MC/MCFixup.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace SystemZ {
|
||||
enum FixupKind {
|
||||
// These correspond directly to R_390_* relocations.
|
||||
FK_390_PC12DBL = FirstTargetFixupKind,
|
||||
FK_390_PC16DBL,
|
||||
FK_390_PC24DBL,
|
||||
FK_390_PC32DBL,
|
||||
FK_390_TLS_CALL,
|
||||
|
||||
// Marker
|
||||
LastTargetFixupKind,
|
||||
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
||||
};
|
||||
} // end namespace SystemZ
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -1,168 +0,0 @@
|
||||
//===-- SystemZMCObjectWriter.cpp - SystemZ ELF writer --------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCTargetDesc/SystemZMCFixups.h"
|
||||
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
||||
#include "llvm/BinaryFormat/ELF.h"
|
||||
#include "llvm/MC/MCELFObjectWriter.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCFixup.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
class SystemZObjectWriter : public MCELFObjectTargetWriter {
|
||||
public:
|
||||
SystemZObjectWriter(uint8_t OSABI);
|
||||
~SystemZObjectWriter() override = default;
|
||||
|
||||
protected:
|
||||
// Override MCELFObjectTargetWriter.
|
||||
unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
|
||||
const MCFixup &Fixup, bool IsPCRel) const override;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
SystemZObjectWriter::SystemZObjectWriter(uint8_t OSABI)
|
||||
: MCELFObjectTargetWriter(/*Is64Bit=*/true, OSABI, ELF::EM_S390,
|
||||
/*HasRelocationAddend=*/ true) {}
|
||||
|
||||
// Return the relocation type for an absolute value of MCFixupKind Kind.
|
||||
static unsigned getAbsoluteReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_1: return ELF::R_390_8;
|
||||
case FK_Data_2: return ELF::R_390_16;
|
||||
case FK_Data_4: return ELF::R_390_32;
|
||||
case FK_Data_8: return ELF::R_390_64;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
// Return the relocation type for a PC-relative value of MCFixupKind Kind.
|
||||
static unsigned getPCRelReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_2: return ELF::R_390_PC16;
|
||||
case FK_Data_4: return ELF::R_390_PC32;
|
||||
case FK_Data_8: return ELF::R_390_PC64;
|
||||
case SystemZ::FK_390_PC12DBL: return ELF::R_390_PC12DBL;
|
||||
case SystemZ::FK_390_PC16DBL: return ELF::R_390_PC16DBL;
|
||||
case SystemZ::FK_390_PC24DBL: return ELF::R_390_PC24DBL;
|
||||
case SystemZ::FK_390_PC32DBL: return ELF::R_390_PC32DBL;
|
||||
}
|
||||
llvm_unreachable("Unsupported PC-relative address");
|
||||
}
|
||||
|
||||
// Return the R_390_TLS_LE* relocation type for MCFixupKind Kind.
|
||||
static unsigned getTLSLEReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_4: return ELF::R_390_TLS_LE32;
|
||||
case FK_Data_8: return ELF::R_390_TLS_LE64;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
// Return the R_390_TLS_LDO* relocation type for MCFixupKind Kind.
|
||||
static unsigned getTLSLDOReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_4: return ELF::R_390_TLS_LDO32;
|
||||
case FK_Data_8: return ELF::R_390_TLS_LDO64;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
// Return the R_390_TLS_LDM* relocation type for MCFixupKind Kind.
|
||||
static unsigned getTLSLDMReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_4: return ELF::R_390_TLS_LDM32;
|
||||
case FK_Data_8: return ELF::R_390_TLS_LDM64;
|
||||
case SystemZ::FK_390_TLS_CALL: return ELF::R_390_TLS_LDCALL;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
// Return the R_390_TLS_GD* relocation type for MCFixupKind Kind.
|
||||
static unsigned getTLSGDReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case FK_Data_4: return ELF::R_390_TLS_GD32;
|
||||
case FK_Data_8: return ELF::R_390_TLS_GD64;
|
||||
case SystemZ::FK_390_TLS_CALL: return ELF::R_390_TLS_GDCALL;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
// Return the PLT relocation counterpart of MCFixupKind Kind.
|
||||
static unsigned getPLTReloc(unsigned Kind) {
|
||||
switch (Kind) {
|
||||
case SystemZ::FK_390_PC12DBL: return ELF::R_390_PLT12DBL;
|
||||
case SystemZ::FK_390_PC16DBL: return ELF::R_390_PLT16DBL;
|
||||
case SystemZ::FK_390_PC24DBL: return ELF::R_390_PLT24DBL;
|
||||
case SystemZ::FK_390_PC32DBL: return ELF::R_390_PLT32DBL;
|
||||
}
|
||||
llvm_unreachable("Unsupported absolute address");
|
||||
}
|
||||
|
||||
unsigned SystemZObjectWriter::getRelocType(MCContext &Ctx,
|
||||
const MCValue &Target,
|
||||
const MCFixup &Fixup,
|
||||
bool IsPCRel) const {
|
||||
MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
|
||||
unsigned Kind = Fixup.getKind();
|
||||
switch (Modifier) {
|
||||
case MCSymbolRefExpr::VK_None:
|
||||
if (IsPCRel)
|
||||
return getPCRelReloc(Kind);
|
||||
return getAbsoluteReloc(Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_NTPOFF:
|
||||
assert(!IsPCRel && "NTPOFF shouldn't be PC-relative");
|
||||
return getTLSLEReloc(Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_INDNTPOFF:
|
||||
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
|
||||
return ELF::R_390_TLS_IEENT;
|
||||
llvm_unreachable("Only PC-relative INDNTPOFF accesses are supported for now");
|
||||
|
||||
case MCSymbolRefExpr::VK_DTPOFF:
|
||||
assert(!IsPCRel && "DTPOFF shouldn't be PC-relative");
|
||||
return getTLSLDOReloc(Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_TLSLDM:
|
||||
assert(!IsPCRel && "TLSLDM shouldn't be PC-relative");
|
||||
return getTLSLDMReloc(Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_TLSGD:
|
||||
assert(!IsPCRel && "TLSGD shouldn't be PC-relative");
|
||||
return getTLSGDReloc(Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_GOT:
|
||||
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
|
||||
return ELF::R_390_GOTENT;
|
||||
llvm_unreachable("Only PC-relative GOT accesses are supported for now");
|
||||
|
||||
case MCSymbolRefExpr::VK_PLT:
|
||||
assert(IsPCRel && "@PLT shouldt be PC-relative");
|
||||
return getPLTReloc(Kind);
|
||||
|
||||
default:
|
||||
llvm_unreachable("Modifier not supported");
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<MCObjectWriter>
|
||||
llvm::createSystemZObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI) {
|
||||
return createELFObjectWriter(llvm::make_unique<SystemZObjectWriter>(OSABI),
|
||||
OS, /*IsLittleEndian=*/false);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user