PPCAsmBackend.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner//===-- PPCAsmBackend.cpp - PPC Assembler Backend -------------------------===// 2b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 3b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// The LLVM Compiler Infrastructure 4b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 5b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// This file is distributed under the University of Illinois Open Source 6b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// License. See LICENSE.TXT for details. 7b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// 8b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner//===----------------------------------------------------------------------===// 9b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 10966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#include "MCTargetDesc/PPCMCTargetDesc.h" 11966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#include "MCTargetDesc/PPCFixupKinds.h" 1279aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/MC/MCAsmBackend.h" 132c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky#include "llvm/MC/MCELFObjectWriter.h" 14f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCFixupKindInfo.h" 15aa4b7dd13ba83152473950d7014a29686dc7eef6Daniel Dunbar#include "llvm/MC/MCMachObjectWriter.h" 16b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner#include "llvm/MC/MCObjectWriter.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionMachO.h" 18ba8297ec08cdf7ae0c1e0c18ce07922e1f822643Jim Grosbach#include "llvm/MC/MCValue.h" 192c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky#include "llvm/Support/ELF.h" 202c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky#include "llvm/Support/ErrorHandling.h" 215510728d28bb1ee04abc32da3d21b7df12948053Charles Davis#include "llvm/Support/MachO.h" 223e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 23b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattnerusing namespace llvm; 24b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 25b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigandstatic uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) { 262c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky switch (Kind) { 272c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky default: 282c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky llvm_unreachable("Unknown fixup kind!"); 292c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky case FK_Data_1: 302c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky case FK_Data_2: 312c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky case FK_Data_4: 32aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella case FK_Data_8: 33349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt case PPC::fixup_ppc_nofixup: 342c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky return Value; 352c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky case PPC::fixup_ppc_brcond14: 369679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand case PPC::fixup_ppc_brcond14abs: 37aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella return Value & 0xfffc; 382c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky case PPC::fixup_ppc_br24: 399679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand case PPC::fixup_ppc_br24abs: 402c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky return Value & 0x3fffffc; 41e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand case PPC::fixup_ppc_half16: 422c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky return Value & 0xffff; 43e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand case PPC::fixup_ppc_half16ds: 4465e90c036472380bba160c349412f37128608e1cUlrich Weigand return Value & 0xfffc; 452c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky } 462c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky} 472c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 48b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigandstatic unsigned getFixupKindNumBytes(unsigned Kind) { 49b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand switch (Kind) { 50b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand default: 51b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand llvm_unreachable("Unknown fixup kind!"); 52b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case FK_Data_1: 53b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand return 1; 54b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case FK_Data_2: 55e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand case PPC::fixup_ppc_half16: 56e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand case PPC::fixup_ppc_half16ds: 57b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand return 2; 58b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case FK_Data_4: 59b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case PPC::fixup_ppc_brcond14: 609679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand case PPC::fixup_ppc_brcond14abs: 61b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case PPC::fixup_ppc_br24: 629679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand case PPC::fixup_ppc_br24abs: 63b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand return 4; 64b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case FK_Data_8: 65b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand return 8; 66b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand case PPC::fixup_ppc_nofixup: 67b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand return 0; 68b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand } 69b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand} 70b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand 71b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattnernamespace { 72ae5abd595f5442767313a4c8a24008ad19323cebDaniel Dunbar 7378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Chengclass PPCAsmBackend : public MCAsmBackend { 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const Target &TheTarget; 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool IsLittleEndian; 76297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbarpublic: 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PPCAsmBackend(const Target &T, bool isLittle) : MCAsmBackend(), TheTarget(T), 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IsLittleEndian(isLittle) {} 792761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar 80297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar unsigned getNumFixupKinds() const { return PPC::NumTargetFixupKinds; } 81297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar 82297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const { 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const static MCFixupKindInfo InfosBE[PPC::NumTargetFixupKinds] = { 84297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar // name offset bits flags 85297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar { "fixup_ppc_br24", 6, 24, MCFixupKindInfo::FKF_IsPCRel }, 86297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar { "fixup_ppc_brcond14", 16, 14, MCFixupKindInfo::FKF_IsPCRel }, 879679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand { "fixup_ppc_br24abs", 6, 24, 0 }, 889679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand { "fixup_ppc_brcond14abs", 16, 14, 0 }, 89e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand { "fixup_ppc_half16", 0, 16, 0 }, 90e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand { "fixup_ppc_half16ds", 0, 14, 0 }, 91349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt { "fixup_ppc_nofixup", 0, 0, 0 } 92297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar }; 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const static MCFixupKindInfo InfosLE[PPC::NumTargetFixupKinds] = { 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // name offset bits flags 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_br24", 2, 24, MCFixupKindInfo::FKF_IsPCRel }, 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_brcond14", 2, 14, MCFixupKindInfo::FKF_IsPCRel }, 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_br24abs", 2, 24, 0 }, 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_brcond14abs", 2, 14, 0 }, 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_half16", 0, 16, 0 }, 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_half16ds", 2, 14, 0 }, 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_ppc_nofixup", 0, 0, 0 } 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 103bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 104297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar if (Kind < FirstTargetFixupKind) 10578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng return MCAsmBackend::getFixupKindInfo(Kind); 106bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 107297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && 108297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar "Invalid kind!"); 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (IsLittleEndian? InfosLE : InfosBE)[Kind - FirstTargetFixupKind]; 110297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar } 111bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 112e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Value, bool IsPCRel) const { 114e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer Value = adjustFixupValue(Fixup.getKind(), Value); 115e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer if (!Value) return; // Doesn't change encoding. 116e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer 117e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer unsigned Offset = Fixup.getOffset(); 118b1cf8de85af10ff3d4ded6431be1cebd6133fd54Ulrich Weigand unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind()); 119e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer 120e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer // For each byte of the fragment that the fixup touches, mask in the bits 121e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer // from the fixup value. The Value has been "split up" into the appropriate 122e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer // bitfields above. 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (unsigned i = 0; i != NumBytes; ++i) { 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Idx = IsLittleEndian ? i : (NumBytes - 1 - i); 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Data[Offset + i] |= uint8_t((Value >> (Idx * 8)) & 0xff); 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 127e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer } 128e8ca482c9734a556f3b66d44ba27e23a1d00b1e0Benjamin Kramer 129ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach bool mayNeedRelaxation(const MCInst &Inst) const { 130297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar // FIXME. 131297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar return false; 132297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar } 133370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach 134370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach bool fixupNeedsRelaxation(const MCFixup &Fixup, 135370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach uint64_t Value, 136251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky const MCRelaxableFragment *DF, 137370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach const MCAsmLayout &Layout) const { 138370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach // FIXME. 139bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("relaxInstruction() unimplemented"); 140370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach } 141370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach 142bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 143ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach void relaxInstruction(const MCInst &Inst, MCInst &Res) const { 144297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar // FIXME. 145bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("relaxInstruction() unimplemented"); 146297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar } 147bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 148ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach bool writeNopData(uint64_t Count, MCObjectWriter *OW) const { 149972befb3f281f0f9ce08d7cf27b4e879327676b0Ulrich Weigand uint64_t NumNops = Count / 4; 150972befb3f281f0f9ce08d7cf27b4e879327676b0Ulrich Weigand for (uint64_t i = 0; i != NumNops; ++i) 151972befb3f281f0f9ce08d7cf27b4e879327676b0Ulrich Weigand OW->Write32(0x60000000); 152972befb3f281f0f9ce08d7cf27b4e879327676b0Ulrich Weigand 1539637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer switch (Count % 4) { 1549637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer default: break; // No leftover bytes to write 1559637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer case 1: OW->Write8(0); break; 1569637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer case 2: OW->Write16(0); break; 1579637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer case 3: OW->Write16(0); OW->Write8(0); break; 1589637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer } 1599637da60835a60f8ccd8289d04c60b2dcd4b9b5aDavid Majnemer 160297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar return true; 161bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach } 162bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 163297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar unsigned getPointerSize() const { 164297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar StringRef Name = TheTarget.getName(); 165f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt if (Name == "ppc64" || Name == "ppc64le") return 8; 166297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar assert(Name == "ppc32" && "Unknown target name!"); 167297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar return 4; 168297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar } 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isLittleEndian() const { 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return IsLittleEndian; 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 173297ed28bf9c633db52ff31115d439a0133b00efbDaniel Dunbar}; 174b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner} // end anonymous namespace 175b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 176b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 177b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner// FIXME: This should be in a separate file. 178b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattnernamespace { 179b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner class DarwinPPCAsmBackend : public PPCAsmBackend { 180b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner public: 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DarwinPPCAsmBackend(const Target &T) : PPCAsmBackend(T, false) { } 182bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 183b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 184b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner bool is64 = getPointerSize() == 8; 185d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang return createPPCMachObjectWriter( 186d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang OS, 187d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang /*Is64Bit=*/is64, 1885510728d28bb1ee04abc32da3d21b7df12948053Charles Davis (is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC), 1895510728d28bb1ee04abc32da3d21b7df12948053Charles Davis MachO::CPU_SUBTYPE_POWERPC_ALL); 190b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner } 191b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner }; 1922c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 1932c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky class ELFPPCAsmBackend : public PPCAsmBackend { 194dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola uint8_t OSABI; 1952c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky public: 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ELFPPCAsmBackend(const Target &T, bool IsLittleEndian, uint8_t OSABI) : 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PPCAsmBackend(T, IsLittleEndian), OSABI(OSABI) { } 198bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 199bc3af9b618c061294c7df00f3313f9c5234b8450Jim Grosbach 2002c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 2012c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky bool is64 = getPointerSize() == 8; 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return createPPCELFObjectWriter(OS, is64, isLittleEndian(), OSABI); 2032c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky } 2042c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky }; 2052c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky 206b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner} // end anonymous namespace 207b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner 208c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createPPCAsmBackend(const Target &T, 209c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling const MCRegisterInfo &MRI, 210c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling StringRef TT, StringRef CPU) { 211912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar if (Triple(TT).isOSDarwin()) 212b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner return new DarwinPPCAsmBackend(T); 213912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar 214dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(Triple(TT).getOS()); 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool IsLittleEndian = Triple(TT).getArch() == Triple::ppc64le; 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new ELFPPCAsmBackend(T, IsLittleEndian, OSABI); 217b46443a686c29a1aa8f881c48c35d3f61a35f7acChris Lattner} 218