aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ldgram.y61
1 files changed, 60 insertions, 1 deletions
diff --git a/ld/ldgram.y b/ld/ldgram.y
index 26e56fe..ea0c569 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -41,6 +41,7 @@
#include "mri.h"
#include "ldctor.h"
#include "ldlex.h"
+#include "lddigest.h"
#ifndef YYDEBUG
#define YYDEBUG 1
@@ -130,6 +131,9 @@ static int error_index;
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
%token SORT_BY_INIT_PRIORITY
+%token DIGEST POLY POLYI TABLE
+%token TIMESTAMP
+%token DEBUG ON OFF
%token '{' '}'
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION
@@ -668,7 +672,7 @@ statement:
{
lang_add_data ((int) $1, $3);
}
- | ASCII '(' mustbe_exp ')' NAME
+ | ASCII '(' mustbe_exp ')' NAME
{
/* 'value' is a memory leak, do we care? */
etree_type *value = $3;
@@ -685,6 +689,31 @@ statement:
{
lang_add_fill ($3);
}
+ | DIGEST NAME
+ { /* CRC_ADDRESS is set in <polynome>, but polynome reserves space, so we use a temporary */
+ digest_label = lang_get_label($2, &digest_big_endian);
+ lang_add_assignment (exp_assign (digest_label, exp_nameop (NAME, "."), false));
+ }
+ polynome '(' mustbe_exp ',' mustbe_exp ')'
+ {
+ if (polynome_valid)
+ {
+ lang_add_assignment (exp_assign (CRC_ADDRESS, exp_nameop (NAME, digest_label), false));
+ lang_add_assignment (exp_assign (CRC_START, $6, false));
+ lang_add_assignment (exp_assign (CRC_END, $8, false));
+ }
+ }
+ | DIGEST TABLE NAME
+ {
+ bool big_endian;
+ const char *label = lang_get_label($3, &big_endian);
+ lang_add_assignment (exp_assign (label, exp_nameop (NAME,"."), false));
+ lang_add_digest_table (big_endian);
+ }
+ | TIMESTAMP
+ {
+ lang_add_timestamp ();
+ }
| ASSERT_K
{ ldlex_expression (); }
'(' exp ',' NAME ')' separator
@@ -692,13 +721,43 @@ statement:
ldlex_popstate ();
lang_add_assignment (exp_assert ($4, $6));
}
+ | DEBUG ON
+ {
+ yydebug = 1;
+ }
+ | DEBUG OFF
+ {
+ yydebug = 0;
+ }
| INCLUDE filename
{
ldfile_open_command_file ($2);
}
+
statement_list_opt END
;
+polynome:
+ NAME
+ {
+ polynome_valid = lang_set_digest($1);
+ }
+ | POLY '(' mustbe_exp ','
+ mustbe_exp ',' mustbe_exp ',' mustbe_exp ','
+ mustbe_exp ',' mustbe_exp ',' mustbe_exp ')'
+ {
+ lang_add_digest (
+ $3->value.value, /* size */
+ $5->value.value, /* polynome */
+ $7->value.value, /* initial value */
+ $9->value.value, /* xor value */
+ $11->value.value, /* input reflected */
+ $13->value.value, /* output reflected */
+ $15->value.value /* reciprocal */
+ );
+ polynome_valid = true;
+ }
+
statement_list:
statement_list statement
| statement