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
17namespace llvm::jitlink::ppc64 {
18
19const char NullPointerContent[8] = {0x00, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x00};
21
22const 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
30const 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.
39const 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
50const 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
61const 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(K: static_cast<Edge::Kind>(K));
141 }
142}
143
144} // end namespace llvm::jitlink::ppc64
145