X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=elfcpp%2Fpowerpc.h;h=8426a5b5839f050062f4801ede04f5d83ff213b8;hb=42cf184456fb1470835b6dccd536c2d74461e7b6;hp=fb4256bdafe8d77e1c9d2b0a096c9e3685086816;hpb=f9c6b9078c54ea0f018b673e2ff128e61a0aa666;p=deliverable%2Fbinutils-gdb.git diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h index fb4256bdaf..8426a5b583 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, 2012 Free Software Foundation, Inc. +// Copyright (C) 2008-2020 Free Software Foundation, Inc. // Written by David S. Miller . // This file is part of elfcpp. @@ -176,6 +176,39 @@ enum 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_TLSGD34 = 148, + R_PPC64_GOT_TLSLD34 = 149, + R_PPC64_GOT_TPREL34 = 150, + R_PPC64_GOT_DTPREL34 = 151, R_PPC_VLE_REL8 = 216, R_PPC_VLE_REL15 = 217, @@ -195,6 +228,14 @@ enum 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_POWERPC_REL16 = 249, @@ -214,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)