diff options
author | T.K. Chia <u1049321969@caramail.com> | 2020-10-05 05:46:23 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-10-05 05:58:33 -0700 |
commit | 6d96a5946d1ec76fea79bc36aa95d7d3dd304200 (patch) | |
tree | 5dfc3a12aef12d0b0938764083ab2f12db6b19d6 /gas/config/tc-i386.c | |
parent | 983d925db6a09ac90f6bed90be16eb69267b58e0 (diff) | |
download | gdb-6d96a5946d1ec76fea79bc36aa95d7d3dd304200.zip gdb-6d96a5946d1ec76fea79bc36aa95d7d3dd304200.tar.gz gdb-6d96a5946d1ec76fea79bc36aa95d7d3dd304200.tar.bz2 |
i386: Allow non-absolute segment values for lcall/ljmp
Allow an unresolved or non-absolute symbol as the segment operand of an
immediate far jump (`ljmp SEG, OFF') or far call (`lcall SEG, OFF').
gas/
2020-10-05 T.K. Chia <u1049321969@caramail.com>
PR gas/26694
* NEWS: Updated for i386 lcall and ljmp change.
* config/tc-i386.c (output_interseg_jump): Allow non-absolute
segment operand for immediate lcall and ljmp.
* testsuite/gas/i386/jump.d,
* testsuite/gas/i386/jump.s,
* testsuite/gas/i386/jump16.d,
* testsuite/gas/i386/jump16.e,
* testsuite/gas/i386/jump16.s: Add tests for non-absolute
segment operand for immediate ljmp.
ld/
2020-10-05 T.K. Chia <u1049321969@caramail.com>
PR gas/26694
* testsuite/ld-i386/ljmp.s,
* testsuite/ld-i386/ljmp1.d,
* testsuite/ld-i386/ljmp1.s,
* testsuite/ld-i386/ljmp2.d,
* testsuite/ld-i386/ljmp2.s,
* testsuite/ld-x86-64/ljmp1.d,
* testsuite/ld-x86-64/ljmp2.d: New testcases.
* testsuite/ld-i386/i386.exp,
* testsuite/ld-x86-64/x86-64.exp: Run them.
Diffstat (limited to 'gas/config/tc-i386.c')
-rw-r--r-- | gas/config/tc-i386.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 8f79847..f3eaba6 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -8776,10 +8776,13 @@ output_interseg_jump (void) else fix_new_exp (frag_now, p - frag_now->fr_literal, size, i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1])); - if (i.op[0].imms->X_op != O_constant) - as_bad (_("can't handle non absolute segment in `%s'"), - i.tm.name); - md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2); + + p += size; + if (i.op[0].imms->X_op == O_constant) + md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2); + else + fix_new_exp (frag_now, p - frag_now->fr_literal, 2, + i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0])); } #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) |