aboutsummaryrefslogtreecommitdiff
path: root/gold/target.h
diff options
context:
space:
mode:
Diffstat (limited to 'gold/target.h')
-rw-r--r--gold/target.h37
1 files changed, 33 insertions, 4 deletions
diff --git a/gold/target.h b/gold/target.h
index 27e8a2e..c0f24ee 100644
--- a/gold/target.h
+++ b/gold/target.h
@@ -321,13 +321,13 @@ class Target
ehframe_datarel_base() const
{ return this->do_ehframe_datarel_base(); }
- // Return true if a reference to SYM from a reloc of type R_TYPE
+ // Return true if a reference to SYM from a reloc at *PRELOC
// means that the current function may call an object compiled
// without -fsplit-stack. SYM is known to be defined in an object
// compiled without -fsplit-stack.
bool
- is_call_to_non_split(const Symbol* sym, unsigned int r_type) const
- { return this->do_is_call_to_non_split(sym, r_type); }
+ is_call_to_non_split(const Symbol* sym, const unsigned char* preloc) const
+ { return this->do_is_call_to_non_split(sym, preloc); }
// A function starts at OFFSET in section SHNDX in OBJECT. That
// function was compiled with -fsplit-stack, but it refers to a
@@ -661,7 +661,7 @@ class Target
// default implementation is that any function not defined by the
// ABI is a call to a non-split function.
virtual bool
- do_is_call_to_non_split(const Symbol* sym, unsigned int) const;
+ do_is_call_to_non_split(const Symbol* sym, const unsigned char*) const;
// Virtual function which may be overridden by the child class.
virtual void
@@ -926,6 +926,22 @@ class Sized_target : public Target
const unsigned char* plocal_symbols,
Relocatable_relocs*) = 0;
+ // Scan the relocs for --emit-relocs. The parameters are
+ // like scan_relocatable_relocs.
+ virtual void
+ emit_relocs_scan(Symbol_table* symtab,
+ Layout* layout,
+ Sized_relobj_file<size, big_endian>* object,
+ unsigned int data_shndx,
+ unsigned int sh_type,
+ const unsigned char* prelocs,
+ size_t reloc_count,
+ Output_section* output_section,
+ bool needs_special_offset_handling,
+ size_t local_symbol_count,
+ const unsigned char* plocal_syms,
+ Relocatable_relocs* rr) = 0;
+
// Emit relocations for a section during a relocatable link, and for
// --emit-relocs. The parameters are like relocate_section, with
// additional parameters for the view of the output reloc section.
@@ -1084,6 +1100,19 @@ class Sized_target : public Target
dst_obj, dst_shndx, dst_off);
}
+ // Return the r_sym field from a relocation.
+ // Most targets can use the default version of this routine,
+ // but some targets have a non-standard r_info field, and will
+ // need to provide a target-specific version.
+ virtual unsigned int
+ get_r_sym(const unsigned char* preloc) const
+ {
+ // Since REL and RELA relocs share the same structure through
+ // the r_info field, we can just use REL here.
+ elfcpp::Rel<size, big_endian> rel(preloc);
+ return elfcpp::elf_r_sym<size>(rel.get_r_info());
+ }
+
protected:
Sized_target(const Target::Target_info* pti)
: Target(pti)