| //===----- 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(static_cast<Edge::Kind>(K)); |
| } |
| } |
| |
| } // end namespace llvm::jitlink::ppc64 |