131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- PPCMCTargetDesc.cpp - PowerPC Target Descriptions -----------------===// 2c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 3c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// The LLVM Compiler Infrastructure 4c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 5c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file is distributed under the University of Illinois Open Source 6c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// License. See LICENSE.TXT for details. 7c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 8c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 9c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 10c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file provides PowerPC specific target descriptions. 11c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 12c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 13c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 14c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCMCTargetDesc.h" 154b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng#include "InstPrinter/PPCInstPrinter.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "PPCMCAsmInfo.h" 17320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola#include "PPCTargetStreamer.h" 186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCContext.h" 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCELFStreamer.h" 2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCExpr.h" 21c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCInstrInfo.h" 22c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCRegisterInfo.h" 23966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#include "llvm/MC/MCStreamer.h" 24c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCSubtargetInfo.h" 256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCSymbolELF.h" 26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MachineLocation.h" 2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/ELF.h" 28655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper#include "llvm/Support/ErrorHandling.h" 29320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola#include "llvm/Support/FormattedStream.h" 303e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 31c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm; 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 34c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_INSTRINFO_MC_DESC 35c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenInstrInfo.inc" 36c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 37c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_SUBTARGETINFO_MC_DESC 38c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenSubtargetInfo.inc" 39c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 40c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_REGINFO_MC_DESC 41c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenRegisterInfo.inc" 42c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 43354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtable to this file. 44354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen RibutzkaPPCTargetStreamer::~PPCTargetStreamer() {} 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPPCTargetStreamer::PPCTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} 46354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka 471abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCInstrInfo *createPPCMCInstrInfo() { 48c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng MCInstrInfo *X = new MCInstrInfo(); 49c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng InitPPCMCInstrInfo(X); 50c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng return X; 51c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} 52c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic MCRegisterInfo *createPPCMCRegisterInfo(const Triple &TT) { 54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool isPPC64 = 55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le); 560e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned Flavour = isPPC64 ? 0 : 1; 570e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR; 580e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 590e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *X = new MCRegisterInfo(); 600e6a052331f674dd70e28af41f654a7874405eabEvan Cheng InitPPCMCRegisterInfo(X, RA, Flavour, Flavour); 610e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return X; 620e6a052331f674dd70e28af41f654a7874405eabEvan Cheng} 630e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic MCSubtargetInfo *createPPCMCSubtargetInfo(const Triple &TT, 656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef CPU, StringRef FS) { 66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return createPPCMCSubtargetInfoImpl(TT, CPU, FS); 67c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} 68c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic MCAsmInfo *createPPCMCAsmInfo(const MCRegisterInfo &MRI, 706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TheTriple) { 71f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt bool isPPC64 = (TheTriple.getArch() == Triple::ppc64 || 72f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt TheTriple.getArch() == Triple::ppc64le); 732d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 742d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MCAsmInfo *MAI; 751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (TheTriple.isOSDarwin()) 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MAI = new PPCMCAsmInfoDarwin(isPPC64, TheTriple); 772d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng else 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MAI = new PPCELFMCAsmInfo(isPPC64, TheTriple); 792d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 802d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Initial state of the frame pointer is R1. 814a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1; 824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCCFIInstruction Inst = 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCCFIInstruction::createDefCfa(nullptr, MRI.getDwarfRegNum(Reg, true), 0); 844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MAI->addInitialFrameState(Inst); 852d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 862d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng return MAI; 871abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng} 881abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void adjustCodeGenOpts(const Triple &TT, Reloc::Model RM, 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeModel::Model &CM) { 91daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt if (CM == CodeModel::Default) { 92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (!TT.isOSDarwin() && 93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le)) 94daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt CM = CodeModel::Medium; 95daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt } 96439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 97439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 98320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolanamespace { 99320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass PPCTargetAsmStreamer : public PPCTargetStreamer { 100320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola formatted_raw_ostream &OS; 101320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 102320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PPCTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS) 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : PPCTargetStreamer(S), OS(OS) {} 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitTCEntry(const MCSymbol &S) override { 106320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola OS << "\t.tc "; 107320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola OS << S.getName(); 108320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola OS << "[TC],"; 109320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola OS << S.getName(); 110320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola OS << '\n'; 111320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitMachine(StringRef CPU) override { 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << "\t.machine " << CPU << '\n'; 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void emitAbiVersion(int AbiVersion) override { 11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OS << "\t.abiversion " << AbiVersion << '\n'; 11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override { 1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); 1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OS << "\t.localentry\t"; 1226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S->print(OS, MAI); 1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OS << ", "; 1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LocalOffset->print(OS, MAI); 1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OS << '\n'; 12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 127320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 128320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 129320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass PPCTargetELFStreamer : public PPCTargetStreamer { 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PPCTargetELFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {} 13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCELFStreamer &getStreamer() { 13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<MCELFStreamer &>(Streamer); 13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitTCEntry(const MCSymbol &S) override { 136320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola // Creates a R_PPC64_TOC relocation 1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Streamer.EmitValueToAlignment(8); 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Streamer.EmitSymbolValue(&S, 8); 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitMachine(StringRef CPU) override { 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: Is there anything to do in here or does this directive only 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // limit the parser? 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void emitAbiVersion(int AbiVersion) override { 14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCAssembler &MCA = getStreamer().getAssembler(); 14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Flags = MCA.getELFHeaderEFlags(); 14737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Flags &= ~ELF::EF_PPC64_ABI; 14837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Flags |= (AbiVersion & ELF::EF_PPC64_ABI); 14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCA.setELFHeaderEFlags(Flags); 15037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override { 15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCAssembler &MCA = getStreamer().getAssembler(); 15337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 15437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int64_t Res; 1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!LocalOffset->evaluateAsAbsolute(Res, MCA)) 15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines report_fatal_error(".localentry expression must be absolute."); 15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 15837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Encoded = ELF::encodePPC64LocalEntryOffset(Res); 15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Res != ELF::decodePPC64LocalEntryOffset(Encoded)) 16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines report_fatal_error(".localentry expression cannot be encoded."); 16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned Other = S->getOther(); 16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Other &= ~ELF::STO_PPC64_LOCAL_MASK; 16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Other |= Encoded; 1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S->setOther(Other); 16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // For GAS compatibility, unless we already saw a .abiversion directive, 16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // set e_flags to indicate ELFv2 ABI. 16937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Flags = MCA.getELFHeaderEFlags(); 17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if ((Flags & ELF::EF_PPC64_ABI) == 0) 17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCA.setELFHeaderEFlags(Flags | 2); 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void emitAssignment(MCSymbol *S, const MCExpr *Value) override { 1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Symbol = cast<MCSymbolELF>(S); 175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // When encoding an assignment to set symbol A to symbol B, also copy 176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // the st_other bits encoding the local entry point offset. 177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (Value->getKind() != MCExpr::SymbolRef) 178ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return; 1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const auto &RhsSym = cast<MCSymbolELF>( 1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static_cast<const MCSymbolRefExpr *>(Value)->getSymbol()); 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned Other = Symbol->getOther(); 182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Other &= ~ELF::STO_PPC64_LOCAL_MASK; 1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Other |= RhsSym.getOther() & ELF::STO_PPC64_LOCAL_MASK; 1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setOther(Other); 185ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PPCTargetMachOStreamer : public PPCTargetStreamer { 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PPCTargetMachOStreamer(MCStreamer &S) : PPCTargetStreamer(S) {} 191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitTCEntry(const MCSymbol &S) override { 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Unknown pseudo-op: .tc"); 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitMachine(StringRef CPU) override { 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: We should update the CPUType, CPUSubType in the Object file if 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the new values are different from the defaults. 197320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void emitAbiVersion(int AbiVersion) override { 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("Unknown pseudo-op: .abiversion"); 20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override { 20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("Unknown pseudo-op: .localentry"); 20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 204320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola}; 205320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola} 206320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S, 2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar formatted_raw_ostream &OS, 2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCInstPrinter *InstPrint, 2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar bool isVerboseAsm) { 2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return new PPCTargetAsmStreamer(S, OS); 212320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola} 213320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic MCTargetStreamer * 2154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarcreateObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) { 216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Triple &TT = STI.getTargetTriple(); 217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (TT.isOSBinFormatELF()) 2184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return new PPCTargetELFStreamer(S); 2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return new PPCTargetMachOStreamer(S); 220966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng} 221966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 2220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic MCInstPrinter *createPPCMCInstPrinter(const Triple &T, 2234b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng unsigned SyntaxVariant, 224b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 22517463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 2260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar const MCRegisterInfo &MRI) { 2270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return new PPCInstPrinter(MAI, MII, MRI, T.isOSDarwin()); 2284b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng} 2294b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng 230e78085a3c03de648a481e9751c3094c517bd7123Evan Chengextern "C" void LLVMInitializePowerPCTargetMC() { 2314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (Target *T : {&ThePPC32Target, &ThePPC64Target, &ThePPC64LETarget}) { 2324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC asm info. 2334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar RegisterMCAsmInfoFn C(*T, createPPCMCAsmInfo); 2344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC codegen info. 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetRegistry::registerMCAdjustCodeGenOpts(*T, adjustCodeGenOpts); 2374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC instruction info. 2394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrInfo(*T, createPPCMCInstrInfo); 2404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC register info. 2424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCRegInfo(*T, createPPCMCRegisterInfo); 2434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC subtarget info. 2454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCSubtargetInfo(*T, createPPCMCSubtargetInfo); 2464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC Code Emitter 2484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCCodeEmitter(*T, createPPCMCCodeEmitter); 2494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 250966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng // Register the asm backend. 2514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCAsmBackend(*T, createPPCAsmBackend); 2524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the object target streamer. 2544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterObjectTargetStreamer(*T, 2554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar createObjectTargetStreamer); 2564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the asm target streamer. 2584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer); 2594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MCInstPrinter. 2614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCInstPrinter(*T, createPPCMCInstPrinter); 2624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 263439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 264