diff options
author | Ian Lance Taylor <iant@google.com> | 2007-11-09 07:00:15 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-11-09 07:00:15 +0000 |
commit | 730cdc88f70c0804b5daf2259d3bd8ad29b6411b (patch) | |
tree | bdc5f06993a5579fea47d658ecb900c9586727f2 /gold/gold.cc | |
parent | 0abe36f50df0f2475fec735f5c907bb7af584ab0 (diff) | |
download | gdb-730cdc88f70c0804b5daf2259d3bd8ad29b6411b.zip gdb-730cdc88f70c0804b5daf2259d3bd8ad29b6411b.tar.gz gdb-730cdc88f70c0804b5daf2259d3bd8ad29b6411b.tar.bz2 |
Generate a complete exception frame header. Discard duplicate
exception frame information.
Diffstat (limited to 'gold/gold.cc')
-rw-r--r-- | gold/gold.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gold/gold.cc b/gold/gold.cc index 9a3a1e6..83bb3f6 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -250,6 +250,14 @@ queue_final_tasks(const General_options& options, thread_count = input_objects->number_of_input_objects(); workqueue->set_thread_count(thread_count); + // Use a blocker to wait until all the input sections have been + // written out. + Task_token* input_sections_blocker = new Task_token(); + + // Use a blocker to block any objects which have to wait for the + // output sections to complete before they can apply relocations. + Task_token* output_sections_blocker = new Task_token(); + // Use a blocker to block the final cleanup task. Task_token* final_blocker = new Task_token(); @@ -259,8 +267,11 @@ queue_final_tasks(const General_options& options, p != input_objects->relobj_end(); ++p) { + input_sections_blocker->add_blocker(); final_blocker->add_blocker(); workqueue->queue(new Relocate_task(options, symtab, layout, *p, of, + input_sections_blocker, + output_sections_blocker, final_blocker)); } @@ -273,10 +284,23 @@ queue_final_tasks(const General_options& options, of, final_blocker)); + // Queue a task to write out the output sections. + output_sections_blocker->add_blocker(); + final_blocker->add_blocker(); + workqueue->queue(new Write_sections_task(layout, of, output_sections_blocker, + final_blocker)); + // Queue a task to write out everything else. final_blocker->add_blocker(); workqueue->queue(new Write_data_task(layout, symtab, of, final_blocker)); + // Queue a task to write out the output sections which depend on + // input sections. + final_blocker->add_blocker(); + workqueue->queue(new Write_after_input_sections_task(layout, of, + input_sections_blocker, + final_blocker)); + // Queue a task to close the output file. This will be blocked by // FINAL_BLOCKER. workqueue->queue(new Task_function(new Close_task_runner(of), |