forked from Imagelibrary/binutils-gdb
* 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user