summaryrefslogtreecommitdiff
path: root/gold/script-sections.h
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2010-09-08 16:10:33 +0000
committerNick Clifton <nickc@redhat.com>2010-09-08 16:10:33 +0000
commit7f8cd8440375de26ebca766ab281c34522262b53 (patch)
treeada43984d6bc35a3487c093cb6b1c5b1a988527b /gold/script-sections.h
parentab3e2b4a1c329818752fe855215d81fe21f88a8b (diff)
downloadbinutils-gdb-7f8cd8440375de26ebca766ab281c34522262b53.tar.gz
* README: Remove claim that MEMORY is not supported.
* expression.cc (script_exp_function_origin) (script_exp_function_length): Move from here to ... * script.cc: ... here. (script_set_section_region, script_add_memory) (script_parse_memory_attr, script_include_directive): New functions. * script-sections.cc (class Memory_region): New class. (class Output_section_definition): Add set_memory_region, set_section_vma, set_section_lma and get_section_name methods. (class Script_Sections): Add add_memory_region, find_memory_region, find_memory_region_origin, find_memory_region_length and set_memory_region methods. Have set_section_addresses method walk the list of set memory regions. Extend the print methos to display memory regions. * script-sections.h: Add prototypes for new methods. Add enum for MEMORY region attributes. * yyscript.y: Add support for parsing MEMORY regions. * script-c.h: Add prototypes for new functions. * testsuite/Makefile.am: Add test of MEMORY region functionality. * testsuite/Makefile.in: Regenerate. * testsuite/memory_test.sh: New script. * testsuite/memory_test.s: New assembler source file. * testsuite/memory_test.t: New linker script.
Diffstat (limited to 'gold/script-sections.h')
-rw-r--r--gold/script-sections.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/gold/script-sections.h b/gold/script-sections.h
index f18b06c7d13..1a0b760793b 100644
--- a/gold/script-sections.h
+++ b/gold/script-sections.h
@@ -37,6 +37,7 @@ struct Parser_output_section_trailer;
struct Input_section_spec;
class Expression;
class Sections_element;
+class Memory_region;
class Phdrs_element;
class Output_data;
class Output_section_definition;
@@ -220,6 +221,27 @@ class Script_sections
set_saw_segment_start_expression(bool value)
{ this->saw_segment_start_expression_ = value; }
+ // Add a memory region.
+ void
+ add_memory_region(const char*, size_t, unsigned int,
+ Expression*, Expression*);
+
+ // Find a memory region's origin.
+ Expression*
+ find_memory_region_origin(const char*, size_t);
+
+ // Find a memory region's length.
+ Expression*
+ find_memory_region_length(const char*, size_t);
+
+ // Find a memory region.
+ Memory_region*
+ find_memory_region(const char*, size_t);
+
+ // Set the memory region of the section.
+ void
+ set_memory_region(Memory_region*, bool);
+
// Print the contents to the FILE. This is for debugging.
void
print(FILE*) const;
@@ -228,6 +250,7 @@ class Script_sections
typedef Sections_elements::iterator Elements_iterator;
private:
+ typedef std::vector<Memory_region*> Memory_regions;
typedef std::vector<Phdrs_element*> Phdrs_elements;
// Create segments.
@@ -271,6 +294,8 @@ class Script_sections
Sections_elements* sections_elements_;
// The current output section, if there is one.
Output_section_definition* output_section_;
+ // The list of memory regions in the MEMORY clause.
+ Memory_regions* memory_regions_;
// The list of program headers in the PHDRS clause.
Phdrs_elements* phdrs_elements_;
// Where to put orphan sections.
@@ -286,6 +311,17 @@ class Script_sections
bool saw_segment_start_expression_;
};
+// Attributes for memory regions.
+enum
+{
+ MEM_EXECUTABLE = (1 << 0),
+ MEM_WRITEABLE = (1 << 1),
+ MEM_READABLE = (1 << 2),
+ MEM_ALLOCATABLE = (1 << 3),
+ MEM_INITIALIZED = (1 << 4),
+ MEM_ATTR_MASK = (1 << 5) - 1
+};
+
} // End namespace gold.
#endif // !defined(GOLD_SCRIPT_SECTIONS_H