Commit 2378a1ff authored by Alan Modra's avatar Alan Modra

PowerPC64 ELFv2 support for gold.

(cherry picked from commit b4f7960d5307fe4aad2126382df78f63696e96b3)
parent 25cf30f3
2013-11-15 Alan Modra <amodra@gmail.com>
Apply mainline changes to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.h (EF_PPC64_ABI): New enum constant.
(STO_PPC64_LOCAL_BIT, STO_PPC64_LOCAL_MASK): Likewise.
(ppc64_decode_local_entry): New function.
(ppc64_encode_local_entry): Likewise.
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
......
// powerpc.h -- ELF definitions specific to EM_PPC and EM_PPC64 -*- C++ -*-
// Copyright 2008, 2010, 2012 Free Software Foundation, Inc.
// Copyright 2008, 2010, 2012, 2013 Free Software Foundation, Inc.
// Written by David S. Miller <davem@davemloft.net>.
// This file is part of elfcpp.
......@@ -214,6 +214,59 @@ 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
};
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)
2013-11-15 Alan Modra <amodra@gmail.com>
Apply changes from mainline to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.cc (Powerpc_relobj::abiversion, set_abiversion,
ppc64_local_entry_offset, ppc64_local_entry_offset,
do_read_symbols): New functions.
(Powerpc_relobj::e_flags_, st_other_): New vars.
(Powerpc_relobj::Powerpc_relobj): Call set_abiversion.
(Powerpc_dynobj::abiversion, set_abiversion): New functions.
(Powerpc_relobj::e_flags_): New var.
(Target_powerpc::first_plt_entry_offset, plt_entry_size): Inline
and adjust for ELFv2.
(Target_powerpc::abiversion, set_abiversion, stk_toc): New functions.
(Powerpc_relobj::do_find_special_sections): Check no .opd in ELFv2.
(Powerpc_dynobj::do_find_special_sections): Likewise.
(Target_powerpc::do_define_standard_symbols): Define ".TOC.".
(Target_powerpc::Branch_info::make_stub): Adjust stub destination
to ELFv2 local entry.
(Target_powerpc::do_relax): No thread safe barriers needed for
ELFv2.
(Output_data_plt_powerpc::initial_plt_entry_size_,
plt_entry_size): Delete. Replace all uses with
first_plt_entry_offset() and plt_entry_size().
(Output_data_plt_powerpc::Output_data_plt_powerpc): Remove
reserved_size parm. Update callers.
(Output_data_plt_powerpc::entry_count): Update.
(Output_data_plt_powerpc::first_plt_entry_offset): Make private
and use Target_powerpc::first_plt_entry_offset().
(Output_data_plt_powerpc::get_plt_entry_size): Similarly and
rename to plt_entry_size.
(Output_data_plt_powerpc::add_ifunc_entry,
add_local_ifunc_entry): Adjust reloc for ELFv2.
(glink_eh_frame_fde_64): Rename to glink_eh_frame_fde_64v1.
(glink_eh_frame_fde_64v2): New.
(Stub_table::plt_call_size): Support ELFv2 sizing.
(Output_data_glink::add_eh_frame): Use the new FDE.
(Output_data_glink::set_final_data_size): Adjust for ELFv2 glink.
(Stub_table::do_write): Write ELFv2 stubs and glink.
(Target_powerpc::Relocate::relocate): Replaces nop after call
with ld 2,24(1) and adjust local offset destination for ELFv2.
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment