commit ab69ae7374c3c9b09586ea403c3fa14e393c5df0 Author: Cary Coutant Date: Tue Jul 30 13:55:30 2013 -0700 Add Target::entry_symbol_name method. gold/ * parameters.cc (Parameters::entry): Return target-specific entry symbol name. * target.h (Target::entry_symbol_name): New function. (Target_info::entry_symbol_name): New data member. * arm.cc (Target_arm::arm_info): Add entry_symbol_name. (Target_arm_nacl::arm_nacl_info): Likewise. * i386.cc (Target_i386::i386_info): Likewise. (Target_i386_nacl::i386_nacl_info): Likewise. * powerpc.cc (Target_powerpc::powerpc_info): Likewise. * sparc.cc (Target_sparc::sparc_info): Likewise. * tilegx.cc (Target_tilegx::tilegx_info): Likewise. * x86_64.cc: (Target_x86_64::x86_64_info) Likewise. (Target_x86_64_nacl::x86_64_nacl_info) Likewise. * testsuite/testfile.cc (Target_test::test_target_info): Likewise. diff --git a/gold/arm.cc b/gold/arm.cc index c980c6b..ddf928b 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -2952,7 +2952,8 @@ const Target::Target_info Target_arm::arm_info = 0, // small_common_section_flags 0, // large_common_section_flags ".ARM.attributes", // attributes_section - "aeabi" // attributes_vendor + "aeabi", // attributes_vendor + "_start" // entry_symbol_name }; // Arm relocate functions class @@ -12216,7 +12217,8 @@ const Target::Target_info Target_arm_nacl::arm_nacl_info = 0, // small_common_section_flags 0, // large_common_section_flags ".ARM.attributes", // attributes_section - "aeabi" // attributes_vendor + "aeabi", // attributes_vendor + "_start" // entry_symbol_name }; template diff --git a/gold/i386.cc b/gold/i386.cc index 59ec885..b2279e7 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -857,7 +857,8 @@ const Target::Target_info Target_i386::i386_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; // Get the GOT section, creating it if necessary. @@ -3964,7 +3965,8 @@ const Target::Target_info Target_i386_nacl::i386_nacl_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; #define NACLMASK 0xe0 // 32-byte alignment mask diff --git a/gold/parameters.cc b/gold/parameters.cc index 2781990..7410e7f 100644 --- a/gold/parameters.cc +++ b/gold/parameters.cc @@ -238,10 +238,7 @@ Parameters::entry() const { const char* ret = this->options().entry(); if (ret == NULL) - { - // FIXME: Need to support target specific entry symbol. - ret = "_start"; - } + ret = parameters->target().entry_symbol_name(); return ret; } diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 7d383f7..676aad6 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1219,7 +1219,8 @@ Target::Target_info Target_powerpc<32, true>::powerpc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -1245,7 +1246,8 @@ Target::Target_info Target_powerpc<32, false>::powerpc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -1271,7 +1273,8 @@ Target::Target_info Target_powerpc<64, true>::powerpc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -1297,7 +1300,8 @@ Target::Target_info Target_powerpc<64, false>::powerpc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; inline bool diff --git a/gold/sparc.cc b/gold/sparc.cc index acb39cd..2af09ae 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -483,7 +483,8 @@ Target::Target_info Target_sparc<32, true>::sparc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -509,7 +510,8 @@ Target::Target_info Target_sparc<64, true>::sparc_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; // We have to take care here, even when operating in little-endian diff --git a/gold/target.h b/gold/target.h index 6523c04..4c58d10 100644 --- a/gold/target.h +++ b/gold/target.h @@ -449,6 +449,11 @@ class Target gc_mark_symbol(Symbol_table* symtab, Symbol* sym) const { this->do_gc_mark_symbol(symtab, sym); } + // Return the name of the entry point symbol. + const char* + entry_symbol_name() const + { return this->pti_->entry_symbol_name; } + protected: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -502,6 +507,8 @@ class Target const char* attributes_section; // Vendor name of vendor attributes. const char* attributes_vendor; + // Name of the main entry point to the program. + const char* entry_symbol_name; }; Target(const Target_info* pti) diff --git a/gold/testsuite/testfile.cc b/gold/testsuite/testfile.cc index da3dc61..f360e3d 100644 --- a/gold/testsuite/testfile.cc +++ b/gold/testsuite/testfile.cc @@ -107,7 +107,8 @@ const Target::Target_info Target_test::test_target_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; // The test targets. diff --git a/gold/tilegx.cc b/gold/tilegx.cc index ab97640..c3918b9 100644 --- a/gold/tilegx.cc +++ b/gold/tilegx.cc @@ -681,7 +681,8 @@ const Target::Target_info Target_tilegx<64, false>::tilegx_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -707,7 +708,8 @@ const Target::Target_info Target_tilegx<32, false>::tilegx_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -733,7 +735,8 @@ const Target::Target_info Target_tilegx<64, true>::tilegx_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -759,7 +762,8 @@ const Target::Target_info Target_tilegx<32, true>::tilegx_info = 0, // small_common_section_flags 0, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; // tilegx relocation handlers diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 8f773bd..4f4d612 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1007,7 +1007,8 @@ const Target::Target_info Target_x86_64<64>::x86_64_info = 0, // small_common_section_flags elfcpp::SHF_X86_64_LARGE, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -1033,7 +1034,8 @@ const Target::Target_info Target_x86_64<32>::x86_64_info = 0, // small_common_section_flags elfcpp::SHF_X86_64_LARGE, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; // This is called when a new output section is created. This is where @@ -4597,7 +4599,8 @@ const Target::Target_info Target_x86_64_nacl<64>::x86_64_nacl_info = 0, // small_common_section_flags elfcpp::SHF_X86_64_LARGE, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; template<> @@ -4623,7 +4626,8 @@ const Target::Target_info Target_x86_64_nacl<32>::x86_64_nacl_info = 0, // small_common_section_flags elfcpp::SHF_X86_64_LARGE, // large_common_section_flags NULL, // attributes_section - NULL // attributes_vendor + NULL, // attributes_vendor + "_start" // entry_symbol_name }; #define NACLMASK 0xe0 // 32-byte alignment mask.