X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gold%2Fgc.h;h=2f79a240cfede9796a4ecf6ea65c98c655c6346f;hb=a71c9b7687b40ba8a2ea22da26c712522e21fe7b;hp=10cdd5f25787d920c3b1969fe62d9584703017cb;hpb=ca09d69af126b596bf21c9d3f7639cae5cd32533;p=platform%2Fupstream%2Fbinutils.git diff --git a/gold/gc.h b/gold/gc.h index 10cdd5f..2f79a24 100644 --- a/gold/gc.h +++ b/gold/gc.h @@ -1,6 +1,6 @@ // gc.h -- garbage collection of unused sections -// Copyright 2009, 2010 Free Software Foundation, Inc. +// Copyright (C) 2009-2014 Free Software Foundation, Inc. // Written by Sriraman Tallam . // This file is part of gold. @@ -37,10 +37,10 @@ namespace gold class Object; template -class Sized_relobj; +class Sized_relobj_file; template -class Reloc_types; +struct Reloc_types; class Output_section; class General_options; @@ -178,7 +178,7 @@ gc_process_relocs( Symbol_table* symtab, Layout*, Target_type* target, - Sized_relobj* src_obj, + Sized_relobj_file* src_obj, unsigned int src_indx, const unsigned char* prelocs, size_t reloc_count, @@ -187,8 +187,6 @@ gc_process_relocs( size_t local_count, const unsigned char* plocal_syms) { - Object* dst_obj; - unsigned int dst_indx; Scan scan; typedef typename Reloc_types::Reloc Reltype; @@ -235,27 +233,33 @@ gc_process_relocs( unsigned int r_type = elfcpp::elf_r_type(r_info); typename elfcpp::Elf_types::Elf_Swxword addend = Reloc_types::get_reloc_addend_noerror(&reloc); + Object* dst_obj; + unsigned int dst_indx; + typedef typename elfcpp::Elf_types::Elf_Addr Address; + Address dst_off; if (r_sym < local_count) { gold_assert(plocal_syms != NULL); typename elfcpp::Sym lsym(plocal_syms + r_sym * sym_size); - unsigned int shndx = lsym.get_st_shndx(); + dst_indx = lsym.get_st_shndx(); bool is_ordinary; - shndx = src_obj->adjust_sym_shndx(r_sym, shndx, &is_ordinary); + dst_indx = src_obj->adjust_sym_shndx(r_sym, dst_indx, &is_ordinary); dst_obj = src_obj; - dst_indx = shndx; + dst_off = lsym.get_st_value() + addend; + if (is_icf_tracked) { + Address symvalue = dst_off - addend; if (is_ordinary) - (*secvec).push_back(Section_id(dst_obj, dst_indx)); + (*secvec).push_back(Section_id(dst_obj, dst_indx)); else (*secvec).push_back(Section_id(NULL, 0)); (*symvec).push_back(NULL); - long long symvalue = static_cast(lsym.get_st_value()); - (*addendvec).push_back(std::make_pair(symvalue, - static_cast(addend))); + (*addendvec).push_back(std::make_pair( + static_cast(symvalue), + static_cast(addend))); uint64_t reloc_offset = convert_to_section_size_type(reloc.get_r_offset()); (*offsetvec).push_back(reloc_offset); @@ -276,7 +280,7 @@ gc_process_relocs( symtab->icf()->set_section_has_function_pointers( src_obj, lsym.get_st_shndx()); - if (!is_ordinary || shndx == src_indx) + if (!is_ordinary || dst_indx == src_indx) continue; } else @@ -294,6 +298,8 @@ gc_process_relocs( dst_obj = gsym->object(); dst_indx = gsym->shndx(&is_ordinary); } + dst_off = static_cast*>(gsym)->value(); + dst_off += addend; // When doing safe folding, check to see if this relocation is that // of a function pointer being taken. @@ -321,17 +327,15 @@ gc_process_relocs( } if (is_icf_tracked) { + Address symvalue = dst_off - addend; if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT) - (*secvec).push_back(Section_id(dst_obj, dst_indx)); + (*secvec).push_back(Section_id(dst_obj, dst_indx)); else (*secvec).push_back(Section_id(NULL, 0)); (*symvec).push_back(gsym); - Sized_symbol* sized_gsym = - static_cast* >(gsym); - long long symvalue = - static_cast(sized_gsym->value()); - (*addendvec).push_back(std::make_pair(symvalue, - static_cast(addend))); + (*addendvec).push_back(std::make_pair( + static_cast(symvalue), + static_cast(addend))); uint64_t reloc_offset = convert_to_section_size_type(reloc.get_r_offset()); (*offsetvec).push_back(reloc_offset); @@ -348,6 +352,9 @@ gc_process_relocs( if (parameters->options().gc_sections()) { symtab->gc()->add_reference(src_obj, src_indx, dst_obj, dst_indx); + parameters->sized_target() + ->gc_add_reference(symtab, src_obj, src_indx, + dst_obj, dst_indx, dst_off); if (cident_section_name != NULL) { Garbage_collection::Cident_section_map::iterator ele =