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()
MachineRegisterInfo & MRI
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...
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)