| //===----- ppc64.cpp - Generic JITLink ppc64 edge kinds, utilities ------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Generic utilities for graphs representing 64-bit PowerPC objects. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ExecutionEngine/JITLink/ppc64.h" | |
| #define DEBUG_TYPE "jitlink" | |
| namespace llvm::jitlink::ppc64 { | |
| const char NullPointerContent[8] = {0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00}; | |
| const char PointerJumpStubContent_little[20] = { | |
| 0x18, 0x00, 0x41, (char)0xf8, // std r2, 24(r1) | |
| 0x00, 0x00, (char)0x82, 0x3d, // addis r12, r2, OffHa | |
| 0x00, 0x00, (char)0x8c, (char)0xe9, // ld r12, OffLo(r12) | |
| (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr r12 | |
| 0x20, 0x04, (char)0x80, 0x4e, // bctr | |
| }; | |
| const char PointerJumpStubContent_big[20] = { | |
| (char)0xf8, 0x41, 0x00, 0x18, // std r2, 24(r1) | |
| 0x3d, (char)0x82, 0x00, 0x00, // addis r12, r2, OffHa | |
| (char)0xe9, (char)0x8c, 0x00, 0x00, // ld r12, OffLo(r12) | |
| 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr r12 | |
| 0x4e, (char)0x80, 0x04, 0x20, // bctr | |
| }; | |
| // TODO: We can use prefixed instructions if LLJIT is running on power10. | |
| const char PointerJumpStubNoTOCContent_little[32] = { | |
| (char)0xa6, 0x02, (char)0x88, 0x7d, // mflr 12 | |
| 0x05, (char)0x00, (char)0x9f, 0x42, // bcl 20,31,.+4 | |
| (char)0xa6, 0x02, 0x68, 0x7d, // mflr 11 | |
| (char)0xa6, 0x03, (char)0x88, 0x7d, // mtlr 12 | |
| 0x00, 0x00, (char)0x8b, 0x3d, // addis 12,11,OffHa | |
| 0x00, 0x00, (char)0x8c, (char)0xe9, // ld 12, OffLo(12) | |
| (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr 12 | |
| 0x20, 0x04, (char)0x80, 0x4e, // bctr | |
| }; | |
| const char PointerJumpStubNoTOCContent_big[32] = { | |
| 0x7d, (char)0x88, 0x02, (char)0xa6, // mflr 12 | |
| 0x42, (char)0x9f, 0x00, 0x05, // bcl 20,31,.+4 | |
| 0x7d, 0x68, 0x02, (char)0xa6, // mflr 11 | |
| 0x7d, (char)0x88, 0x03, (char)0xa6, // mtlr 12 | |
| 0x3d, (char)0x8b, 0x00, 0x00, // addis 12,11,OffHa | |
| (char)0xe9, (char)0x8c, 0x00, 0x00, // ld 12, OffLo(12) | |
| 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr 12 | |
| 0x4e, (char)0x80, 0x04, 0x20, // bctr | |
| }; | |
| const char *getEdgeKindName(Edge::Kind K) { | |
| switch (K) { | |
| case Pointer64: | |
| return "Pointer64"; | |
| case Pointer32: | |
| return "Pointer32"; | |
| case Pointer16: | |
| return "Pointer16"; | |
| case Pointer16DS: | |
| return "Pointer16DS"; | |
| case Pointer16HA: | |
| return "Pointer16HA"; | |
| case Pointer16HI: | |
| return "Pointer16HI"; | |
| case Pointer16HIGH: | |
| return "Pointer16HIGH"; | |
| case Pointer16HIGHA: | |
| return "Pointer16HIGHA"; | |
| case Pointer16HIGHER: | |
| return "Pointer16HIGHER"; | |
| case Pointer16HIGHERA: | |
| return "Pointer16HIGHERA"; | |
| case Pointer16HIGHEST: | |
| return "Pointer16HIGHEST"; | |
| case Pointer16HIGHESTA: | |
| return "Pointer16HIGHESTA"; | |
| case Pointer16LO: | |
| return "Pointer16LO"; | |
| case Pointer16LODS: | |
| return "Pointer16LODS"; | |
| case Pointer14: | |
| return "Pointer14"; | |
| case Delta64: | |
| return "Delta64"; | |
| case Delta34: | |
| return "Delta34"; | |
| case Delta32: | |
| return "Delta32"; | |
| case NegDelta32: | |
| return "NegDelta32"; | |
| case Delta16: | |
| return "Delta16"; | |
| case Delta16HA: | |
| return "Delta16HA"; | |
| case Delta16HI: | |
| return "Delta16HI"; | |
| case Delta16LO: | |
| return "Delta16LO"; | |
| case TOC: | |
| return "TOC"; | |
| case TOCDelta16: | |
| return "TOCDelta16"; | |
| case TOCDelta16DS: | |
| return "TOCDelta16DS"; | |
| case TOCDelta16HA: | |
| return "TOCDelta16HA"; | |
| case TOCDelta16HI: | |
| return "TOCDelta16HI"; | |
| case TOCDelta16LO: | |
| return "TOCDelta16LO"; | |
| case TOCDelta16LODS: | |
| return "TOCDelta16LODS"; | |
| case RequestGOTAndTransformToDelta34: | |
| return "RequestGOTAndTransformToDelta34"; | |
| case CallBranchDelta: | |
| return "CallBranchDelta"; | |
| case CallBranchDeltaRestoreTOC: | |
| return "CallBranchDeltaRestoreTOC"; | |
| case RequestCall: | |
| return "RequestCall"; | |
| case RequestCallNoTOC: | |
| return "RequestCallNoTOC"; | |
| case RequestTLSDescInGOTAndTransformToTOCDelta16HA: | |
| return "RequestTLSDescInGOTAndTransformToTOCDelta16HA"; | |
| case RequestTLSDescInGOTAndTransformToTOCDelta16LO: | |
| return "RequestTLSDescInGOTAndTransformToTOCDelta16LO"; | |
| case RequestTLSDescInGOTAndTransformToDelta34: | |
| return "RequestTLSDescInGOTAndTransformToDelta34"; | |
| default: | |
| return getGenericEdgeKindName(K); | |
| } | |
| } | |
| } // end namespace llvm::jitlink::ppc64 |