1 //===----- ppc64.cpp - Generic JITLink ppc64 edge kinds, utilities ------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Generic utilities for graphs representing 64-bit PowerPC objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/ExecutionEngine/JITLink/ppc64.h" 14 15 #define DEBUG_TYPE "jitlink" 16 17 namespace llvm::jitlink::ppc64 { 18 19 const char NullPointerContent[8] = {0x00, 0x00, 0x00, 0x00, 20 0x00, 0x00, 0x00, 0x00}; 21 22 const char PointerJumpStubContent_little[20] = { 23 0x18, 0x00, 0x41, (char)0xf8, // std r2, 24(r1) 24 0x00, 0x00, (char)0x82, 0x3d, // addis r12, r2, OffHa 25 0x00, 0x00, (char)0x8c, (char)0xe9, // ld r12, OffLo(r12) 26 (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr r12 27 0x20, 0x04, (char)0x80, 0x4e, // bctr 28 }; 29 30 const char PointerJumpStubContent_big[20] = { 31 (char)0xf8, 0x41, 0x00, 0x18, // std r2, 24(r1) 32 0x3d, (char)0x82, 0x00, 0x00, // addis r12, r2, OffHa 33 (char)0xe9, (char)0x8c, 0x00, 0x00, // ld r12, OffLo(r12) 34 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr r12 35 0x4e, (char)0x80, 0x04, 0x20, // bctr 36 }; 37 38 // TODO: We can use prefixed instructions if LLJIT is running on power10. 39 const char PointerJumpStubNoTOCContent_little[32] = { 40 (char)0xa6, 0x02, (char)0x88, 0x7d, // mflr 12 41 0x05, (char)0x00, (char)0x9f, 0x42, // bcl 20,31,.+4 42 (char)0xa6, 0x02, 0x68, 0x7d, // mflr 11 43 (char)0xa6, 0x03, (char)0x88, 0x7d, // mtlr 12 44 0x00, 0x00, (char)0x8b, 0x3d, // addis 12,11,OffHa 45 0x00, 0x00, (char)0x8c, (char)0xe9, // ld 12, OffLo(12) 46 (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr 12 47 0x20, 0x04, (char)0x80, 0x4e, // bctr 48 }; 49 50 const char PointerJumpStubNoTOCContent_big[32] = { 51 0x7d, (char)0x88, 0x02, (char)0xa6, // mflr 12 52 0x42, (char)0x9f, 0x00, 0x05, // bcl 20,31,.+4 53 0x7d, 0x68, 0x02, (char)0xa6, // mflr 11 54 0x7d, (char)0x88, 0x03, (char)0xa6, // mtlr 12 55 0x3d, (char)0x8b, 0x00, 0x00, // addis 12,11,OffHa 56 (char)0xe9, (char)0x8c, 0x00, 0x00, // ld 12, OffLo(12) 57 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr 12 58 0x4e, (char)0x80, 0x04, 0x20, // bctr 59 }; 60 61 const char *getEdgeKindName(Edge::Kind K) { 62 switch (K) { 63 case Pointer64: 64 return "Pointer64"; 65 case Pointer32: 66 return "Pointer32"; 67 case Pointer16: 68 return "Pointer16"; 69 case Pointer16DS: 70 return "Pointer16DS"; 71 case Pointer16HA: 72 return "Pointer16HA"; 73 case Pointer16HI: 74 return "Pointer16HI"; 75 case Pointer16HIGH: 76 return "Pointer16HIGH"; 77 case Pointer16HIGHA: 78 return "Pointer16HIGHA"; 79 case Pointer16HIGHER: 80 return "Pointer16HIGHER"; 81 case Pointer16HIGHERA: 82 return "Pointer16HIGHERA"; 83 case Pointer16HIGHEST: 84 return "Pointer16HIGHEST"; 85 case Pointer16HIGHESTA: 86 return "Pointer16HIGHESTA"; 87 case Pointer16LO: 88 return "Pointer16LO"; 89 case Pointer16LODS: 90 return "Pointer16LODS"; 91 case Pointer14: 92 return "Pointer14"; 93 case Delta64: 94 return "Delta64"; 95 case Delta34: 96 return "Delta34"; 97 case Delta32: 98 return "Delta32"; 99 case NegDelta32: 100 return "NegDelta32"; 101 case Delta16: 102 return "Delta16"; 103 case Delta16HA: 104 return "Delta16HA"; 105 case Delta16HI: 106 return "Delta16HI"; 107 case Delta16LO: 108 return "Delta16LO"; 109 case TOC: 110 return "TOC"; 111 case TOCDelta16: 112 return "TOCDelta16"; 113 case TOCDelta16DS: 114 return "TOCDelta16DS"; 115 case TOCDelta16HA: 116 return "TOCDelta16HA"; 117 case TOCDelta16HI: 118 return "TOCDelta16HI"; 119 case TOCDelta16LO: 120 return "TOCDelta16LO"; 121 case TOCDelta16LODS: 122 return "TOCDelta16LODS"; 123 case RequestGOTAndTransformToDelta34: 124 return "RequestGOTAndTransformToDelta34"; 125 case CallBranchDelta: 126 return "CallBranchDelta"; 127 case CallBranchDeltaRestoreTOC: 128 return "CallBranchDeltaRestoreTOC"; 129 case RequestCall: 130 return "RequestCall"; 131 case RequestCallNoTOC: 132 return "RequestCallNoTOC"; 133 case RequestTLSDescInGOTAndTransformToTOCDelta16HA: 134 return "RequestTLSDescInGOTAndTransformToTOCDelta16HA"; 135 case RequestTLSDescInGOTAndTransformToTOCDelta16LO: 136 return "RequestTLSDescInGOTAndTransformToTOCDelta16LO"; 137 case RequestTLSDescInGOTAndTransformToDelta34: 138 return "RequestTLSDescInGOTAndTransformToDelta34"; 139 default: 140 return getGenericEdgeKindName(static_cast<Edge::Kind>(K)); 141 } 142 } 143 144 } // end namespace llvm::jitlink::ppc64 145