52#define GET_INSTRINFO_MC_DESC
53#define ENABLE_INSTR_PREDICATE_VERIFIER
54#include "PPCGenInstrInfo.inc"
56#define GET_SUBTARGETINFO_MC_DESC
57#include "PPCGenSubtargetInfo.inc"
59#define GET_REGINFO_MC_DESC
60#include "PPCGenRegisterInfo.inc"
124 int16_t regClass =
Desc.operands()[OpNo].RegClass;
128 case PPC::VSSRCRegClassID:
129 case PPC::VSFRCRegClassID:
131 return PPC::VSX32 + (Reg - PPC::VF0);
135 case PPC::VSRCRegClassID:
137 return PPC::VSX32 + (Reg - PPC::V0);
153 InitPPCMCInstrInfo(
X);
158 bool isPPC64 = TT.isPPC64();
159 unsigned Flavour = isPPC64 ? 0 : 1;
160 unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR;
163 InitPPCMCRegisterInfo(
X,
RA, Flavour, Flavour);
170 std::string FullFS = std::string(FS);
174 FullFS =
"+aix," + FullFS;
179 return createPPCMCSubtargetInfoImpl(TT, CPU, CPU, FullFS);
185 bool isPPC64 = TheTriple.
isPPC64();
194 unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1;
205 formatted_raw_ostream &OS;
208 PPCTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
209 : PPCTargetStreamer(S), OS(OS) {}
213 MCSymbolXCOFF *TCSym =
214 static_cast<const MCSectionXCOFF *
>(
Streamer.getCurrentSectionOnly())
215 ->getQualNameSymbol();
227 <<
getContext().getAsmInfo().getSpecifierName(Kind) <<
'\n';
239 void emitMachine(StringRef CPU)
override {
240 const Triple &
TT =
Streamer.getContext().getTargetTriple();
241 if (
TT.isOSBinFormatXCOFF())
242 OS <<
"\t.machine\t" <<
'\"' << CPU <<
'\"' <<
'\n';
244 OS <<
"\t.machine " << CPU <<
'\n';
247 void emitAbiVersion(
int AbiVersion)
override {
248 OS <<
"\t.abiversion " << AbiVersion <<
'\n';
251 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
252 const MCAsmInfo &MAI =
Streamer.getContext().getAsmInfo();
254 OS <<
"\t.localentry\t";
264 PPCTargetELFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
266 MCELFStreamer &getStreamer() {
267 return static_cast<MCELFStreamer &
>(
Streamer);
276 void emitMachine(StringRef CPU)
override {
281 void emitAbiVersion(
int AbiVersion)
override {
282 ELFObjectWriter &
W = getStreamer().getWriter();
283 unsigned Flags =
W.getELFHeaderEFlags();
284 Flags &= ~ELF::EF_PPC64_ABI;
286 W.setELFHeaderEFlags(Flags);
289 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
293 unsigned Encoded = encodePPC64LocalEntryOffset(LocalOffset);
296 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
302 ELFObjectWriter &
W = getStreamer().getWriter();
303 unsigned Flags =
W.getELFHeaderEFlags();
305 W.setELFHeaderEFlags(Flags | 2);
308 void emitAssignment(MCSymbol *S,
const MCExpr *
Value)
override {
309 auto *
Symbol =
static_cast<MCSymbolELF *
>(S);
313 if (copyLocalEntry(Symbol,
Value))
314 UpdateOther.insert(Symbol);
316 UpdateOther.erase(Symbol);
319 void finish()
override {
320 for (
auto *Sym : UpdateOther)
321 if (Sym->isVariable())
322 copyLocalEntry(Sym, Sym->getVariableValue());
330 SmallPtrSet<MCSymbolELF *, 32> UpdateOther;
332 bool copyLocalEntry(MCSymbolELF *
D,
const MCExpr *S) {
336 auto &RhsSym =
static_cast<const MCSymbolELF &
>(
Ref->getSymbol());
337 unsigned Other =
D->getOther();
338 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
344 unsigned encodePPC64LocalEntryOffset(
const MCExpr *LocalOffset) {
345 MCAssembler &MCA = getStreamer().getAssembler();
347 if (!LocalOffset->evaluateAsAbsolute(
Offset, MCA))
349 ".localentry expression must be absolute");
354 LocalOffset->
getLoc(),
".localentry expression must be a power of 2");
372 PPCTargetMachOStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
378 void emitMachine(StringRef CPU)
override {
383 void emitAbiVersion(
int AbiVersion)
override {
387 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
394 PPCTargetXCOFFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
397 const MCAsmInfo &MAI =
Streamer.getContext().getAsmInfo();
404 void emitMachine(StringRef CPU)
override {
405 static_cast<XCOFFObjectWriter &
>(
Streamer.getAssemblerPtr()->getWriter())
409 void emitAbiVersion(
int AbiVersion)
override {
413 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
423 return new PPCTargetAsmStreamer(S, OS);
433 if (TT.isOSBinFormatELF())
434 return new PPCTargetELFStreamer(S);
435 if (TT.isOSBinFormatXCOFF())
436 return new PPCTargetXCOFFStreamer(S);
437 return new PPCTargetMachOStreamer(S);
441 unsigned SyntaxVariant,
452 explicit PPCMCInstrAnalysis(
const MCInstrInfo *Info)
453 : MCInstrAnalysis(
Info) {}
470 return new PPCMCInstrAnalysis(Info);
static MCTargetStreamer * createNullTargetStreamer(MCStreamer &S)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_EXTERNAL_VISIBILITY
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static MCTargetStreamer * createAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
static MCInstPrinter * createPPCMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCTargetStreamer * createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTargetMC()
static MCInstrAnalysis * createPPCMCInstrAnalysis(const MCInstrInfo *Info)
static MCAsmInfo * createPPCMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TheTriple, const MCTargetOptions &Options)
static MCSubtargetInfo * createPPCMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
static MCRegisterInfo * createPPCMCRegisterInfo(const Triple &TT)
static MCInstrInfo * createPPCMCInstrInfo()
SI optimize exec mask operations pre RA
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file defines the SmallPtrSet class.
std::unique_ptr< MCStreamer > && Streamer
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)
void printExpr(raw_ostream &, const MCExpr &) const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
MCContext & getContext() const
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.
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
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
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
LLVM_ABI unsigned getOther() const
LLVM_ABI void setOther(unsigned Other)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
StringRef getSymbolTableName() const
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
StringRef getName() const
getName - Get the symbol name.
Target specific streamer interface.
MCTargetStreamer(MCStreamer &S)
~PPCTargetStreamer() override
PPCTargetStreamer(MCStreamer &S)
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 isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
bool isPPC64() const
Tests whether the target is 64-bit PowerPC (little and big endian).
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
const char * stripRegisterPrefix(const char *RegName)
stripRegisterPrefix - This method strips the character prefix from a register name so that only the n...
MCRegister getRegNumForOperand(const MCInstrDesc &Desc, MCRegister Reg, unsigned OpNo)
getRegNumForOperand - some operands use different numbering schemes for the same registers.
static bool isVRRegister(MCRegister Reg)
static bool isVFRegister(MCRegister Reg)
constexpr uint64_t PointerSize
aarch64 pointer size.
This is an optimization pass for GlobalISel generic memory operations.
Target & getThePPC64LETarget()
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Target & getThePPC32Target()
MCAsmBackend * createPPCAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
MCStreamer * createPPCXCOFFStreamer(const Triple &, MCContext &, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
@ Ref
The access may reference the value stored in memory.
Target & getThePPC64Target()
MCCodeEmitter * createPPCMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
Target & getThePPC32LETarget()
MCStreamer * createPPCELFStreamer(const Triple &, MCContext &, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.
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 RegisterXCOFFStreamer(Target &T, Target::XCOFFStreamerCtorTy Fn)
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter 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)