X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=elfcpp%2Fpowerpc.h;h=2ab73625f9b519239a1a74243e8307e88c05fc91;hb=83015056b2bdfb53e4b4d59ffbb3574fc5dffd88;hp=2bcb3ca12e5ffddd322b392039ccd89bcda911fc;hpb=6e5710cea9c8a6dc04e7b3deb606b7234715e926;p=deliverable%2Fbinutils-gdb.git diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h index 2bcb3ca12e..2ab73625f9 100644 --- a/elfcpp/powerpc.h +++ b/elfcpp/powerpc.h @@ -1,6 +1,6 @@ // powerpc.h -- ELF definitions specific to EM_PPC and EM_PPC64 -*- C++ -*- -// Copyright 2008, 2010 Free Software Foundation, Inc. +// Copyright (C) 2008-2020 Free Software Foundation, Inc. // Written by David S. Miller . // This file is part of elfcpp. @@ -137,40 +137,111 @@ enum R_POWERPC_GOT_DTPREL16_LO = 92, R_POWERPC_GOT_DTPREL16_HI = 93, R_POWERPC_GOT_DTPREL16_HA = 94, + R_PPC_TLSGD = 95, R_PPC64_TPREL16_DS = 95, + R_PPC_TLSLD = 96, R_PPC64_TPREL16_LO_DS = 96, R_PPC64_TPREL16_HIGHER = 97, R_PPC64_TPREL16_HIGHERA = 98, R_PPC64_TPREL16_HIGHEST = 99, R_PPC64_TPREL16_HIGHESTA = 100, - R_PPC64_DTPREL16_DS = 101, - R_PPC64_DTPREL16_LO_DS = 102, - R_PPC64_DTPREL16_HIGHER = 103, - R_PPC64_DTPREL16_HIGHERA = 104, - R_PPC64_DTPREL16_HIGHEST = 105, - R_PPC64_DTPREL16_HIGHESTA = 106, R_PPC_EMB_NADDR32 = 101, + R_PPC64_DTPREL16_DS = 101, R_PPC_EMB_NADDR16 = 102, + R_PPC64_DTPREL16_LO_DS = 102, R_PPC_EMB_NADDR16_LO = 103, + R_PPC64_DTPREL16_HIGHER = 103, R_PPC_EMB_NADDR16_HI = 104, + R_PPC64_DTPREL16_HIGHERA = 104, R_PPC_EMB_NADDR16_HA = 105, + R_PPC64_DTPREL16_HIGHEST = 105, R_PPC_EMB_SDAI16 = 106, + R_PPC64_DTPREL16_HIGHESTA = 106, R_PPC_EMB_SDA2I16 = 107, + R_PPC64_TLSGD = 107, R_PPC_EMB_SDA2REL = 108, + R_PPC64_TLSLD = 108, R_PPC_EMB_SDA21 = 109, + R_PPC64_TOCSAVE = 109, R_PPC_EMB_MRKREF = 110, + R_PPC64_ADDR16_HIGH = 110, R_PPC_EMB_RELSEC16 = 111, + R_PPC64_ADDR16_HIGHA = 111, R_PPC_EMB_RELST_LO = 112, + R_PPC64_TPREL16_HIGH = 112, R_PPC_EMB_RELST_HI = 113, + R_PPC64_TPREL16_HIGHA = 113, R_PPC_EMB_RELST_HA = 114, + R_PPC64_DTPREL16_HIGH = 114, R_PPC_EMB_BIT_FLD = 115, + R_PPC64_DTPREL16_HIGHA = 115, R_PPC_EMB_RELSDA = 116, + R_PPC64_REL24_NOTOC = 116, + R_PPC64_ADDR64_LOCAL = 117, + R_PPC64_ENTRY = 118, + R_POWERPC_PLTSEQ = 119, + R_POWERPC_PLTCALL = 120, + R_PPC64_PLTSEQ_NOTOC = 121, + R_PPC64_PLTCALL_NOTOC = 122, + R_PPC64_PCREL_OPT = 123, + + R_PPC64_D34 = 128, + R_PPC64_D34_LO = 129, + R_PPC64_D34_HI30 = 130, + R_PPC64_D34_HA30 = 131, + R_PPC64_PCREL34 = 132, + R_PPC64_GOT_PCREL34 = 133, + R_PPC64_PLT_PCREL34 = 134, + R_PPC64_PLT_PCREL34_NOTOC = 135, + R_PPC64_ADDR16_HIGHER34 = 136, + R_PPC64_ADDR16_HIGHERA34 = 137, + R_PPC64_ADDR16_HIGHEST34 = 138, + R_PPC64_ADDR16_HIGHESTA34 = 139, + R_PPC64_REL16_HIGHER34 = 140, + R_PPC64_REL16_HIGHERA34 = 141, + R_PPC64_REL16_HIGHEST34 = 142, + R_PPC64_REL16_HIGHESTA34 = 143, + R_PPC64_D28 = 144, + R_PPC64_PCREL28 = 145, + R_PPC64_TPREL34 = 146, + R_PPC64_DTPREL34 = 147, + R_PPC64_GOT_TLSGD_PCREL34 = 148, + R_PPC64_GOT_TLSLD_PCREL34 = 149, + R_PPC64_GOT_TPREL_PCREL34 = 150, + R_PPC64_GOT_DTPREL_PCREL34 = 151, + + R_PPC_VLE_REL8 = 216, + R_PPC_VLE_REL15 = 217, + R_PPC_VLE_REL24 = 218, + R_PPC_VLE_LO16A = 219, + R_PPC_VLE_LO16D = 220, + R_PPC_VLE_HI16A = 221, + R_PPC_VLE_HI16D = 222, + R_PPC_VLE_HA16A = 223, + R_PPC_VLE_HA16D = 224, + R_PPC_VLE_SDA21 = 225, + R_PPC_VLE_SDA21_LO = 226, + R_PPC_VLE_SDAREL_LO16A = 227, + R_PPC_VLE_SDAREL_LO16D = 228, + R_PPC_VLE_SDAREL_HI16A = 229, + R_PPC_VLE_SDAREL_HI16D = 230, + R_PPC_VLE_SDAREL_HA16A = 231, + R_PPC_VLE_SDAREL_HA16D = 232, + R_PPC64_REL16_HIGH = 240, + R_PPC64_REL16_HIGHA = 241, + R_PPC64_REL16_HIGHER = 242, + R_PPC64_REL16_HIGHERA = 243, + R_PPC64_REL16_HIGHEST = 244, + R_PPC64_REL16_HIGHESTA = 245, + + R_POWERPC_REL16DX_HA = 246, + R_PPC64_JMP_IREL = 247, R_POWERPC_IRELATIVE = 248, - R_PPC_REL16 = 249, - R_PPC_REL16_LO = 250, - R_PPC_REL16_HI = 251, - R_PPC_REL16_HA = 252, + R_POWERPC_REL16 = 249, + R_POWERPC_REL16_LO = 250, + R_POWERPC_REL16_HI = 251, + R_POWERPC_REL16_HA = 252, R_POWERPC_GNU_VTINHERIT = 253, R_POWERPC_GNU_VTENTRY = 254, R_PPC_TOC16 = 255, @@ -184,6 +255,99 @@ enum EF_PPC_RELOCATABLE_LIB = 0x00008000, // PowerPC -mrelocatable-lib flag. */ }; +// e_flags values defined for powerpc64 +enum +{ + // ABI version + // 1 for original function descriptor using ABI, + // 2 for revised ABI without function descriptors, + // 0 for unspecified or not using any features affected by the differences. + EF_PPC64_ABI = 3 +}; + +// Object attribute tags. 0-3 are generic. +enum +{ + // FP ABI, low 2 bits: + // 1 for double precision hard-float, + // 2 for soft-float, + // 3 for single precision hard-float. + // 0 for not tagged or not using any ABIs affected by the differences. + // Next 2 bits: + // 1 for ibm long double + // 2 for 64-bit long double + // 3 for IEEE long double. + // 0 for not tagged or not using any ABIs affected by the differences. + Tag_GNU_Power_ABI_FP = 4, + + // Value 1 for general purpose registers only, 2 for AltiVec + // registers, 3 for SPE registers; 0 for not tagged or not using any + // ABIs affected by the differences. + Tag_GNU_Power_ABI_Vector = 8, + + // Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes, + // 2 for ABIs using memory; 0 for not tagged or not using any ABIs + // affected by the differences. + Tag_GNU_Power_ABI_Struct_Return = 12 +}; + +// DT_PPC_OPT bits +enum +{ + PPC_OPT_TLS = 1 +}; + +// DT_PPC64_OPT bits +enum +{ + PPC64_OPT_TLS = 1, + PPC64_OPT_MULTI_TOC = 2, + PPC64_OPT_LOCALENTRY = 4 +}; + +enum +{ + // The ELFv2 ABI uses three bits in the symbol st_other field of a + // function definition to specify the number of instructions between a + // function's global entry point and local entry point. + // The global entry point is used when it is necessary to set up the + // toc pointer (r2) for the function. Callers must enter the global + // entry point with r12 set to the global entry point address. On + // return from the function, r2 may have a different value to that + // which it had on entry. + // The local entry point is used when r2 is known to already be valid + // for the function. There is no requirement on r12 when using the + // local entry point, and on return r2 will contain the same value as + // at entry. + // A value of zero in these bits means that the function has a single + // entry point with no requirement on r12 or r2, and that on return r2 + // will contain the same value as at entry. + // Values of one and seven are reserved. + + STO_PPC64_LOCAL_BIT = 5, + STO_PPC64_LOCAL_MASK = 0xE0 +}; + +// 3 bit other field to bytes. +static inline unsigned int +ppc64_decode_local_entry(unsigned int other) +{ + return ((1 << other) >> 2) << 2; +} + +// bytes to field value. +static inline unsigned int +ppc64_encode_local_entry(unsigned int val) +{ + return (val >= 4 * 4 + ? (val >= 8 * 4 + ? (val >= 16 * 4 ? 6 : 5) + : 4) + : (val >= 2 * 4 + ? 3 + : (val >= 1 * 4 ? 2 : 0))); +} + } // End namespace elfcpp. #endif // !defined(ELFCPP_POWERPC_H)