diff options
author | Ian Lance Taylor <iant@google.com> | 2008-02-28 19:46:06 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2008-02-28 19:46:06 +0000 |
commit | da769d5629564b82d4eec1b256ffc562d5c01624 (patch) | |
tree | c575a166927823074cd07dad6347b0e90072340f /gold/script.cc | |
parent | * f-typeprint.c (f_print_type): Handle NULL pointer in VARSTRING (diff) | |
download | binutils-gdb-da769d5629564b82d4eec1b256ffc562d5c01624.tar.gz binutils-gdb-da769d5629564b82d4eec1b256ffc562d5c01624.tar.bz2 binutils-gdb-da769d5629564b82d4eec1b256ffc562d5c01624.zip |
Read input scripts which look like input objects with proper
serialization.
Diffstat (limited to 'gold/script.cc')
-rw-r--r-- | gold/script.cc | 72 |
1 files changed, 12 insertions, 60 deletions
diff --git a/gold/script.cc b/gold/script.cc index 42fb71ca7d5..307d1cfaa2f 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -846,47 +846,6 @@ Lex::next_token() return &this->token_; } -// A trivial task which waits for THIS_BLOCKER to be clear and then -// clears NEXT_BLOCKER. THIS_BLOCKER may be NULL. - -class Script_unblock : public Task -{ - public: - Script_unblock(Task_token* this_blocker, Task_token* next_blocker) - : this_blocker_(this_blocker), next_blocker_(next_blocker) - { } - - ~Script_unblock() - { - if (this->this_blocker_ != NULL) - delete this->this_blocker_; - } - - Task_token* - is_runnable() - { - if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked()) - return this->this_blocker_; - return NULL; - } - - void - locks(Task_locker* tl) - { tl->add(this, this->next_blocker_); } - - void - run(Workqueue*) - { } - - std::string - get_name() const - { return "Script_unblock"; } - - private: - Task_token* this_blocker_; - Task_token* next_blocker_; -}; - // class Symbol_assignment. // Add the symbol to the symbol table. This makes sure the symbol is @@ -1347,8 +1306,7 @@ class Parser_closure }; // FILE was found as an argument on the command line. Try to read it -// as a script. We've already read BYTES of data into P, but we -// ignore that. Return true if the file was handled. +// as a script. Return true if the file was handled. bool read_input_script(Workqueue* workqueue, const General_options& options, @@ -1356,9 +1314,11 @@ read_input_script(Workqueue* workqueue, const General_options& options, Dirsearch* dirsearch, Input_objects* input_objects, Input_group* input_group, const Input_argument* input_argument, - Input_file* input_file, const unsigned char*, off_t, - Task_token* this_blocker, Task_token* next_blocker) + Input_file* input_file, Task_token* next_blocker, + bool* used_next_blocker) { + *used_next_blocker = false; + std::string input_string; Lex::read_file(input_file, &input_string); @@ -1375,20 +1335,10 @@ read_input_script(Workqueue* workqueue, const General_options& options, if (yyparse(&closure) != 0) return false; - // THIS_BLOCKER must be clear before we may add anything to the - // symbol table. We are responsible for unblocking NEXT_BLOCKER - // when we are done. We are responsible for deleting THIS_BLOCKER - // when it is unblocked. - if (!closure.saw_inputs()) - { - // The script did not add any files to read. Note that we are - // not permitted to call NEXT_BLOCKER->unblock() here even if - // THIS_BLOCKER is NULL, as we do not hold the workqueue lock. - workqueue->queue(new Script_unblock(this_blocker, next_blocker)); - return true; - } + return true; + Task_token* this_blocker = NULL; for (Input_arguments::const_iterator p = closure.inputs()->begin(); p != closure.inputs()->end(); ++p) @@ -1401,12 +1351,14 @@ read_input_script(Workqueue* workqueue, const General_options& options, nb = new Task_token(true); nb->add_blocker(); } - workqueue->queue(new Read_symbols(options, input_objects, symtab, - layout, dirsearch, &*p, - input_group, this_blocker, nb)); + workqueue->queue_soon(new Read_symbols(options, input_objects, symtab, + layout, dirsearch, &*p, + input_group, this_blocker, nb)); this_blocker = nb; } + *used_next_blocker = true; + return true; } |