diff options
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-bpf.c | 44 |
2 files changed, 49 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index fa19030..e33802b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2019-07-19 Jose E. Marchesi <jose.marchesi@oracle.com> + + * config/tc-bpf.c (pe_lcomm_internal): Adapted from tc-i386.c. + (pe_lcomm): Likewise. + (md_pseudo_table): Use pe_lcomm to implement .lcomm. + 2019-07-19 Richard Sandiford <richard.sandiford@arm.com> * doc/c-aarch64.texi: Remame the +bitperm extension to +sve2-bitperm. diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c index 4b92b77..d2da2fe 100644 --- a/gas/config/tc-bpf.c +++ b/gas/config/tc-bpf.c @@ -35,16 +35,58 @@ const char line_separator_chars[] = "`"; const char EXP_CHARS[] = "eE"; const char FLT_CHARS[] = "fFdD"; +/* Like s_lcomm_internal in gas/read.c but the alignment string + is allowed to be optional. */ + +static symbolS * +pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size) +{ + addressT align = 0; + + SKIP_WHITESPACE (); + + if (needs_align + && *input_line_pointer == ',') + { + align = parse_align (needs_align - 1); + + if (align == (addressT) -1) + return NULL; + } + else + { + if (size >= 8) + align = 3; + else if (size >= 4) + align = 2; + else if (size >= 2) + align = 1; + else + align = 0; + } + + bss_alloc (symbolP, size, align); + return symbolP; +} + +static void +pe_lcomm (int needs_align) +{ + s_comm_internal (needs_align * 2, pe_lcomm_internal); +} + /* The target specific pseudo-ops which we support. */ const pseudo_typeS md_pseudo_table[] = { { "half", cons, 2 }, { "word", cons, 4 }, { "dword", cons, 8 }, - { "lcomm", s_lcomm, 1 }, + { "lcomm", pe_lcomm, 1 }, { NULL, NULL, 0 } }; + + /* ISA handling. */ static CGEN_BITSET *bpf_isa; |