X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fplugin.h;h=b37b641a6f8ed2e355e5565eb6f81c894c38fc85;hb=612f258a491539f36c618030cc558e83e7d58b4e;hp=9ef2812909284cc90b8894d8645647f71d524be0;hpb=54674d38930c7da1af518510fede6f700f5ca596;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/plugin.h b/gold/plugin.h index 9ef2812909..b37b641a6f 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -1,6 +1,6 @@ // plugin.h -- plugin manager for gold -*- C++ -*- -// Copyright (C) 2008-2014 Free Software Foundation, Inc. +// Copyright (C) 2008-2020 Free Software Foundation, Inc. // Written by Cary Coutant . // This file is part of gold. @@ -47,6 +47,7 @@ class Task; class Task_token; class Pluginobj; class Plugin_rescan; +class Plugin_recorder; // This class represents a single plugin library. @@ -60,6 +61,7 @@ class Plugin claim_file_handler_(NULL), all_symbols_read_handler_(NULL), cleanup_handler_(NULL), + new_input_handler_(NULL), cleanup_done_(false) { } @@ -78,6 +80,10 @@ class Plugin void all_symbols_read(); + // Call the new_input handler. + void + new_input(struct ld_plugin_input_file* plugin_input_file); + // Call the cleanup handler. void cleanup(); @@ -97,6 +103,11 @@ class Plugin set_cleanup_handler(ld_plugin_cleanup_handler handler) { this->cleanup_handler_ = handler; } + // Register a new_input handler. + void + set_new_input_handler(ld_plugin_new_input_handler handler) + { this->new_input_handler_ = handler; } + // Add an argument void add_option(const char* arg) @@ -104,6 +115,10 @@ class Plugin this->args_.push_back(arg); } + const std::string& + filename() const + { return this->filename_; } + private: Plugin(const Plugin&); Plugin& operator=(const Plugin&); @@ -118,6 +133,7 @@ class Plugin ld_plugin_claim_file_handler claim_file_handler_; ld_plugin_all_symbols_read_handler all_symbols_read_handler_; ld_plugin_cleanup_handler cleanup_handler_; + ld_plugin_new_input_handler new_input_handler_; // TRUE if the cleanup handlers have been called. bool cleanup_done_; }; @@ -134,11 +150,20 @@ class Plugin_manager in_claim_file_handler_(false), options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL), symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL), - this_blocker_(NULL), extra_search_path_() + this_blocker_(NULL), extra_search_path_(), lock_(NULL), + initialize_lock_(&lock_), defsym_defines_set_(), + recorder_(NULL) { this->current_ = plugins_.end(); } ~Plugin_manager(); + // Returns true if the symbol name is used in the LHS of a defsym. + bool + is_defsym_def(const char* sym_name) const + { + return defsym_defines_set_.find(sym_name) != defsym_defines_set_.end(); + } + // Add a plugin library. void add_plugin(const char* filename) @@ -217,6 +242,14 @@ class Plugin_manager (*this->current_)->set_all_symbols_read_handler(handler); } + // Register a new_input handler. + void + set_new_input_handler(ld_plugin_new_input_handler handler) + { + gold_assert(this->current_ != plugins_.end()); + (*this->current_)->set_new_input_handler(handler); + } + // Register a claim-file handler. void set_cleanup_handler(ld_plugin_cleanup_handler handler) @@ -281,10 +314,18 @@ class Plugin_manager input_objects() const { return this->input_objects_; } + Symbol_table* + symtab() + { return this->symtab_; } + Layout* layout() { return this->layout_; } + Plugin_recorder* + recorder() const + { return this->recorder_; } + private: Plugin_manager(const Plugin_manager&); Plugin_manager& operator=(const Plugin_manager&); @@ -373,9 +414,18 @@ class Plugin_manager Mapfile* mapfile_; Task_token* this_blocker_; - // An extra directory to seach for the libraries passed by + // An extra directory to search for the libraries passed by // add_input_library. std::string extra_search_path_; + Lock* lock_; + Initialize_lock initialize_lock_; + + // Keep track of all symbols defined by defsym. + typedef Unordered_set Defsym_defines_set; + Defsym_defines_set defsym_defines_set_; + + // Class to record plugin actions. + Plugin_recorder* recorder_; }; @@ -393,7 +443,8 @@ class Pluginobj : public Object // Fill in the symbol resolution status for the given plugin symbols. ld_plugin_status - get_symbol_resolution_info(int nsyms, + get_symbol_resolution_info(Symbol_table* symtab, + int nsyms, ld_plugin_symbol* syms, int version) const; @@ -425,6 +476,16 @@ class Pluginobj : public Object filesize() { return this->filesize_; } + // Return the word size of the object file. + int + elfsize() const + { gold_unreachable(); } + + // Return TRUE if this is a big-endian object file. + bool + is_big_endian() const + { gold_unreachable(); } + protected: // Return TRUE if this is an object claimed by a plugin. virtual Pluginobj*