31#define GET_INSTRINFO_MC_DESC
32#define ENABLE_INSTR_PREDICATE_VERIFIER
33#include "LoongArchGenInstrInfo.inc"
35#define GET_REGINFO_MC_DESC
36#include "LoongArchGenRegisterInfo.inc"
38#define GET_SUBTARGETINFO_MC_DESC
39#include "LoongArchGenSubtargetInfo.inc"
45 InitLoongArchMCRegisterInfo(
X, LoongArch::R1);
51 InitLoongArchMCInstrInfo(
X);
57 if (CPU.empty() || CPU ==
"generic")
58 CPU = TT.isArch64Bit() ?
"generic-la64" :
"generic-la32";
59 return createLoongArchMCSubtargetInfoImpl(TT, CPU, CPU, FS);
68 unsigned SP =
MRI.getDwarfRegNum(LoongArch::R3,
true);
76 unsigned SyntaxVariant,
103 int64_t GPRState[31] = {};
104 std::bitset<31> GPRValidMask;
106 static bool isGPR(MCRegister
Reg) {
107 return Reg >= LoongArch::R0 &&
Reg <= LoongArch::R31;
110 static unsigned getRegIndex(MCRegister
Reg) {
111 assert(isGPR(
Reg) &&
Reg != LoongArch::R0 &&
"Invalid GPR reg");
112 return Reg - LoongArch::R1;
115 void setGPRState(MCRegister
Reg, std::optional<int64_t>
Value) {
116 if (
Reg == LoongArch::R0)
123 GPRValidMask.set(Index);
125 GPRValidMask.reset(Index);
129 std::optional<int64_t> getGPRState(MCRegister
Reg)
const {
130 if (
Reg == LoongArch::R0)
135 if (GPRValidMask.test(Index))
136 return GPRState[
Index];
141 explicit LoongArchMCInstrAnalysis(
const MCInstrInfo *Info)
142 : MCInstrAnalysis(
Info) {}
144 void resetState()
override { GPRValidMask.reset(); }
146 void updateState(
const MCInst &Inst,
const MCSubtargetInfo *STI,
153 if (isTerminator(Inst) || isCall(Inst)) {
163 for (
unsigned I = 0;
I < NumDefs; ++
I) {
166 setGPRState(DefReg, std::nullopt);
170 case LoongArch::PCADDU18I:
182 if ((
isBranch(Inst) && !isIndirectBranch(Inst)) ||
188 if (Inst.
getOpcode() == LoongArch::JIRL) {
199 bool isTerminator(
const MCInst &Inst)
const override {
206 case LoongArch::JIRL:
211 bool isCall(
const MCInst &Inst)
const override {
218 case LoongArch::JIRL:
223 bool isReturn(
const MCInst &Inst)
const override {
230 case LoongArch::JIRL:
236 bool isBranch(
const MCInst &Inst)
const override {
243 case LoongArch::JIRL:
249 bool isUnconditionalBranch(
const MCInst &Inst)
const override {
256 case LoongArch::JIRL:
262 bool isIndirectBranch(
const MCInst &Inst)
const override {
269 case LoongArch::JIRL:
276 std::vector<std::pair<uint64_t, uint64_t>>
277 findPltEntries(
uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
278 const MCSubtargetInfo &STI)
const override {
279 uint32_t LoadInsnOpCode;
281 LoadInsnOpCode = 0x28c00000;
282 else if (
T.isLoongArch32())
283 LoadInsnOpCode = 0x28800000;
287 constexpr uint64_t FirstEntryAt = 32, EntrySize = 16;
288 if (PltContents.
size() < FirstEntryAt + EntrySize)
291 std::vector<std::pair<uint64_t, uint64_t>>
Results;
292 for (
uint64_t EntryStart = FirstEntryAt,
293 EntryStartEnd = PltContents.
size() - EntrySize;
294 EntryStart <= EntryStartEnd; EntryStart += EntrySize) {
296 const uint32_t PcaddInsn =
298 if (((PcaddInsn & 0xfe000000) != 0x1a000000) &&
299 ((PcaddInsn & 0xfe000000) != 0x1c000000))
302 const uint32_t LoadInsn =
304 if ((LoadInsn & 0xffc00000) != LoadInsnOpCode)
307 if (((LoadInsn >> 5) & 0x1f) != (PcaddInsn & 0x1f))
312 ((PcaddInsn & 0xfe000000) == 0x1c000000)
316 GotPltSlotVA = uint32_t(GotPltSlotVA);
317 Results.emplace_back(PltSectionVA + EntryStart, GotPltSlotVA);
327 return new LoongArchMCInstrAnalysis(Info);
332 std::unique_ptr<MCAsmBackend> &&MAB,
333 std::unique_ptr<MCObjectWriter> &&MOW,
334 std::unique_ptr<MCCodeEmitter> &&MCE) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Function Alias Analysis Results
#define LLVM_EXTERNAL_VISIBILITY
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static MCSubtargetInfo * createLoongArchMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
static MCTargetStreamer * createLoongArchObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
static MCInstPrinter * createLoongArchMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCRegisterInfo * createLoongArchMCRegisterInfo(const Triple &TT)
static MCTargetStreamer * createLoongArchAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
static MCAsmInfo * createLoongArchMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options)
static MCTargetStreamer * createLoongArchNullTargetStreamer(MCStreamer &S)
static MCInstrAnalysis * createLoongArchInstrAnalysis(const MCInstrInfo *Info)
static MCInstrInfo * createLoongArchMCInstrInfo()
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLoongArchTargetMC()
static bool isBranch(unsigned Opcode)
MachineRegisterInfo & MRI
size_t size() const
Get the array size.
This class is intended to be used as a base class for asm properties and features specific to the tar...
void addInitialFrameState(const MCCFIInstruction &Inst)
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Context object for machine code objects.
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
unsigned getNumOperands() const
unsigned getOpcode() const
const MCOperand & getOperand(unsigned i) const
virtual bool isCall(const MCInst &Inst) const
virtual bool isBranch(const MCInst &Inst) const
virtual bool isUnconditionalBranch(const MCInst &Inst) const
virtual bool isTerminator(const MCInst &Inst) const
virtual bool isReturn(const MCInst &Inst) const
virtual bool isIndirectBranch(const MCInst &Inst) const
Interface to description of machine instruction set.
MCRegister getReg() const
Returns the register number.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Streaming machine code generation interface.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
Target specific streamer interface.
Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
bool isLoongArch64() const
Tests whether the target is 64-bit LoongArch.
bool isLoongArch32() const
Tests whether the target is 32-bit LoongArch.
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
uint32_t read32le(const void *P)
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheLoongArch64Target()
MCCodeEmitter * createLoongArchMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
MCAsmBackend * createLoongArchAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
Target & getTheLoongArch32Target()
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
MCELFStreamer * createLoongArchELFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > MOW, std::unique_ptr< MCCodeEmitter > MCE)
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn)
RegisterMCAsmInfo - Register a MCAsmInfo implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)