From 42e5fcbf34e8d4850abaef7b3e6021348e59eedd Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Wed, 18 Mar 2009 15:28:24 +0000 Subject: [PATCH] 2009-03-18 Andrew Stubbs gas/ * config/tc-arm.c (md_apply_fix): Check BFD_RELOC_ARM_IMMEDIATE and BFD_RELOC_ARM_ADRL_IMMEDIATE value is in the correct section. Check BFD_RELOC_ARM_ADRL_IMMEDIATE has a defined symbol. gas/testsuites/ * gas/arm/adr-invalid.d: New file. * gas/arm/adr-invalid.l: New file. * gas/arm/adr-invalid.s: New file. --- gas/ChangeLog | 6 ++++++ gas/config/tc-arm.c | 27 +++++++++++++++++++++++++++ gas/testsuite/ChangeLog | 6 ++++++ gas/testsuite/gas/arm/adr-invalid.d | 2 ++ gas/testsuite/gas/arm/adr-invalid.l | 5 +++++ gas/testsuite/gas/arm/adr-invalid.s | 12 ++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 gas/testsuite/gas/arm/adr-invalid.d create mode 100644 gas/testsuite/gas/arm/adr-invalid.l create mode 100644 gas/testsuite/gas/arm/adr-invalid.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 35d60da7d74..78e86878024 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2009-03-18 Andrew Stubbs + + * config/tc-arm.c (md_apply_fix): Check BFD_RELOC_ARM_IMMEDIATE and + BFD_RELOC_ARM_ADRL_IMMEDIATE value is in the correct section. + Check BFD_RELOC_ARM_ADRL_IMMEDIATE has a defined symbol. + 2009-03-18 Alan Modra * as.h: Include alloca-conf.h instead of config.h and remove diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index bb783bdd40e..98d8b7ffa3e 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -18537,6 +18537,15 @@ md_apply_fix (fixS * fixP, break; } + if (fixP->fx_addsy + && S_GET_SEGMENT (fixP->fx_addsy) != seg) + { + as_bad_where (fixP->fx_file, fixP->fx_line, + _("symbol %s is in a different section"), + S_GET_NAME (fixP->fx_addsy)); + break; + } + newimm = encode_arm_immediate (value); temp = md_chars_to_number (buf, INSN_SIZE); @@ -18560,6 +18569,24 @@ md_apply_fix (fixS * fixP, unsigned int highpart = 0; unsigned int newinsn = 0xe1a00000; /* nop. */ + if (fixP->fx_addsy + && ! S_IS_DEFINED (fixP->fx_addsy)) + { + as_bad_where (fixP->fx_file, fixP->fx_line, + _("undefined symbol %s used as an immediate value"), + S_GET_NAME (fixP->fx_addsy)); + break; + } + + if (fixP->fx_addsy + && S_GET_SEGMENT (fixP->fx_addsy) != seg) + { + as_bad_where (fixP->fx_file, fixP->fx_line, + _("symbol %s is in a different section"), + S_GET_NAME (fixP->fx_addsy)); + break; + } + newimm = encode_arm_immediate (value); temp = md_chars_to_number (buf, INSN_SIZE); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 1ef1ed31687..d5e95883ba4 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-03-18 Andrew Stubbs + + * gas/arm/adr-invalid.d: New file. + * gas/arm/adr-invalid.l: New file. + * gas/arm/adr-invalid.s: New file. + 2009-03-14 Richard Sandiford * gas/ppc/textalign-xcoff-001.d: Expect the section VMAs to be diff --git a/gas/testsuite/gas/arm/adr-invalid.d b/gas/testsuite/gas/arm/adr-invalid.d new file mode 100644 index 00000000000..d8043dc7bbe --- /dev/null +++ b/gas/testsuite/gas/arm/adr-invalid.d @@ -0,0 +1,2 @@ +# name: Invalid use of ADR and ADRL +# error-output: adr-invalid.l diff --git a/gas/testsuite/gas/arm/adr-invalid.l b/gas/testsuite/gas/arm/adr-invalid.l new file mode 100644 index 00000000000..817646e99e1 --- /dev/null +++ b/gas/testsuite/gas/arm/adr-invalid.l @@ -0,0 +1,5 @@ +[^:]*: Assembler messages: +[^:]*:3: Error: symbol var is in a different section +[^:]*:4: Error: undefined symbol undefinedvar used as an immediate value +[^:]*:5: Error: symbol var is in a different section +[^:]*:6: Error: undefined symbol undefinedvar used as an immediate value diff --git a/gas/testsuite/gas/arm/adr-invalid.s b/gas/testsuite/gas/arm/adr-invalid.s new file mode 100644 index 00000000000..8ff38601b15 --- /dev/null +++ b/gas/testsuite/gas/arm/adr-invalid.s @@ -0,0 +1,12 @@ + .text +start: + adr r0, var + adr r0, undefinedvar + adrl r1, var + adrl r1, undefinedvar + + .data + .globl var +var: + .word 0x00000000 + -- 2.30.2