* 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.
This commit is contained in:
Nick Clifton
2010-09-08 16:10:33 +00:00
parent ab3e2b4a1c
commit 7f8cd84403
14 changed files with 706 additions and 36 deletions

View File

@@ -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