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(K: static_cast<Edge::Kind>(K)); |
141 | } |
142 | } |
143 | |
144 | } // end namespace llvm::jitlink::ppc64 |
145 | |