diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-i386.c | 23 | ||||
-rw-r--r-- | gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l | 62 | ||||
-rw-r--r-- | gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l | 122 | ||||
-rw-r--r-- | gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s | 36 |
5 files changed, 149 insertions, 96 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 047aaba..50d890c 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -5467,6 +5467,9 @@ x86_ginsn_addsub_reg_mem (const symbolS *insn_end_sym) if (i.mem_operands) return ginsn; + /* Skip detection of 8/16/32-bit op size; 'add/sub reg, reg/mem' ops always + make the dest reg untraceable for SCFI. */ + /* op reg, reg/mem. */ src1_dw2_regnum = ginsn_dw2_regnum (i.op[0].regs); /* Of interest only when second opnd is not memory. */ @@ -5505,6 +5508,9 @@ x86_ginsn_addsub_mem_reg (const symbolS *insn_end_sym) if (i.mem_operands && !i.base_reg && !i.index_reg) return ginsn; + /* Skip detection of 8/16/32-bit op size; 'add/sub reg/mem, reg' ops always + make the dest reg untraceable for SCFI. */ + /* op reg/mem, %reg. */ dw2_regnum = ginsn_dw2_regnum (i.op[1].regs); @@ -5585,6 +5591,11 @@ x86_ginsn_alu_imm (const symbolS *insn_end_sym) if (i.mem_operands == 1) return ginsn; + /* 8/16/32-bit op size makes the destination reg untraceable for SCFI. + Deal with this via the x86_ginsn_unhandled () code path. */ + if (i.suffix != QWORD_MNEM_SUFFIX) + return ginsn; + gas_assert (i.imm_operands == 1); src_imm = i.op[0].imms->X_add_number; /* The second operand may be a register or indirect access. For SCFI, only @@ -5631,6 +5642,12 @@ x86_ginsn_move (const symbolS *insn_end_sym) if (i.mem_operands == 1 && !i.base_reg && !i.index_reg) return ginsn; + /* 8/16/32-bit op size makes the destination reg untraceable for SCFI. + Handle mov reg, reg only. mov to or from a memory operand will make + dest reg, when present, untraceable, irrespective of the op size. */ + if (i.reg_operands == 2 && i.suffix != QWORD_MNEM_SUFFIX) + return ginsn; + gas_assert (i.tm.opcode_space == SPACE_BASE); if (opcode == 0x8b || opcode == 0x8a) { @@ -6027,6 +6044,12 @@ x86_ginsn_new (const symbolS *insn_end_sym, enum ginsn_gen_mode gmode) switch (opcode) { + + /* Add opcodes 0x0/0x2 and sub opcodes 0x28/0x2a (with opcode_space + SPACE_BASE) are 8-bit ops. While they are relevant for SCFI + correctness, skip handling them here and use the x86_ginsn_unhandled + code path to generate GINSN_TYPE_OTHER when necessary. */ + case 0x1: /* add reg, reg/mem. */ case 0x29: /* sub reg, reg/mem. */ if (i.tm.opcode_space != SPACE_BASE) diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l b/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l index ff078d4..5190e45 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l @@ -12,38 +12,42 @@ GAS LISTING .* 7 0000 54 push %rsp 7 ginsn: SUB %r7, 8, %r7 7 ginsn: STORE %r7, \[%r7\+0\] - 8 0001 4889E5 movq %rsp, %rbp - 8 ginsn: MOV %r7, %r6 - 9 - 10 0004 48010425 addq %rax, symbol - 10 00000000 - 11 000c 03042500 add symbol, %eax - 11 000000 - 12 0013 670320 add \(%eax\), %esp - 12 ginsn: ADD \[%r0\+0\], %r7, %r7 - 13 0016 67012405 add %esp, \(,%eax\) - 13 00000000 - 14 001e 67032405 add \(,%eax\), %esp + 8 0001 01C5 add %eax, %ebp + 8 ginsn: ADD %r0, %r6, %r6 + 9 0003 4889E5 movq %rsp, %rbp + 9 ginsn: MOV %r7, %r6 + 10 + 11 0006 48010425 addq %rax, symbol + 11 00000000 + 12 000e 03042500 add symbol, %eax + 12 000000 + 13 0015 670320 add \(%eax\), %esp + 13 ginsn: ADD \[%r0\+0\], %r7, %r7 + 14 0018 67012405 add %esp, \(,%eax\) 14 00000000 - 14 ginsn: ADD \[%r0\+0\], %r7, %r7 - 15 - 16 0026 4801C3 addq %rax, %rbx - 16 ginsn: ADD %r0, %r3, %r3 - 17 0029 01C3 add %eax, %ebx + 15 0020 67032405 add \(,%eax\), %esp + 15 00000000 + 15 ginsn: ADD \[%r0\+0\], %r7, %r7 + 16 + 17 0028 4801C3 addq %rax, %rbx 17 ginsn: ADD %r0, %r3, %r3 - 18 - 19 002b 4883D408 adc \$8, %rsp + 18 002b 01C3 add %eax, %ebx + 18 ginsn: ADD %r0, %r3, %r3 + 19 002d 83C408 add \$8, %esp 19 ginsn: OTH 0, 0, %r7 20 - 21 002f 488345F0 addq \$1, -16\(%rbp\) - 21 01 + 21 0030 4883D408 adc \$8, %rsp + 21 ginsn: OTH 0, 0, %r7 22 - 23 0034 4803D8 \{load\} addq %rax, %rbx - 23 ginsn: ADD %r0, %r3, %r3 + 23 0034 488345F0 addq \$1, -16\(%rbp\) + 23 01 24 - 25 0037 C3 ret - 25 ginsn: RET - 26 .LFE0: - 26 ginsn: SYM .LFE0 - 27 .size foo, .-foo - 27 ginsn: SYM FUNC_END + 25 0039 4803D8 {load} addq %rax, %rbx + 25 ginsn: ADD %r0, %r3, %r3 + 26 + 27 003c C3 ret + 27 ginsn: RET + 28 .LFE0: + 28 ginsn: SYM .LFE0 + 29 .size foo, .-foo + 29 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s b/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s index f939836..f6bf5a0 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s @@ -5,6 +5,7 @@ .type foo, @function foo: push %rsp + add %eax, %ebp movq %rsp, %rbp addq %rax, symbol @@ -15,6 +16,7 @@ foo: addq %rax, %rbx add %eax, %ebx + add $8, %esp adc $8, %rsp diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l b/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l index f242e1f..8a8edd5 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l @@ -1,69 +1,85 @@ GAS LISTING .* -.*# Testcase for DWARF regnum ginsn API + 1 # Testcase for DWARF regnum ginsn API 2 .text 3 .globl foo 4 .type foo, @function 4 ginsn: SYM FUNC_BEGIN 5 foo: 5 ginsn: SYM foo - 6 0000 0408 add \$8, %al - 7 0002 80C108 add \$8, %cl - 7 ginsn: ADD %r2, 8, %r2 - 8 0005 80C208 add \$8, %dl - 8 ginsn: ADD %r1, 8, %r1 - 9 0008 80C408 add \$8, %ah - 9 ginsn: ADD %r0, 8, %r0 - 10 000b 80C508 add \$8, %ch - 10 ginsn: ADD %r2, 8, %r2 - 11 000e 80C608 add \$8, %dh - 11 ginsn: ADD %r1, 8, %r1 - 12 0011 80C708 add \$8, %bh - 12 ginsn: ADD %r3, 8, %r3 - 13 - 14 0014 4080C008 add \$8, %axl - 14 ginsn: ADD %r0, 8, %r0 - 15 0018 4080C408 add \$8, %spl - 15 ginsn: ADD %r7, 8, %r7 + 6 0000 55 push %rbp + 6 ginsn: SUB %r7, 8, %r7 + 6 ginsn: STORE %r6, \[%r7\+0\] + 7 0001 4889E5 mov %rsp, %rbp + 7 ginsn: MOV %r7, %r6 + 8 + 9 0004 8A40FE mov -0x2\(%rax\), %al + 9 ginsn: MOV \[%r0\+-2\], %r0 + 10 0007 8A58FE mov -0x2\(%rax\), %bl + 10 ginsn: MOV \[%r0\+-2\], %r3 + 11 000a 8A50FE mov -0x2\(%rax\), %dl + 11 ginsn: MOV \[%r0\+-2\], %r1 + 12 000d 8A60FE mov -0x2\(%rax\), %ah + 12 ginsn: MOV \[%r0\+-2\], %r0 + 13 0010 8A68FE mov -0x2\(%rax\), %ch + 13 ginsn: MOV \[%r0\+-2\], %r2 + 14 0013 8A70FE mov -0x2\(%rax\), %dh + 14 ginsn: MOV \[%r0\+-2\], %r1 + 15 0016 8A78FE mov -0x2\(%rax\), %bh + 15 ginsn: MOV \[%r0\+-2\], %r3 16 - 17 001c 6683C008 add \$8, %ax - 17 ginsn: ADD %r0, 8, %r0 - 18 0020 664183C0 add \$8, %r8w - 18 08 - 18 ginsn: ADD %r8, 8, %r8 - 19 0025 6683C408 add \$8, %sp - 19 ginsn: ADD %r7, 8, %r7 - 20 - 21 0029 83C008 add \$8, %eax - 21 ginsn: ADD %r0, 8, %r0 - 22 002c 4183C008 add \$8, %r8d - 22 ginsn: ADD %r8, 8, %r8 - 23 0030 81C40040 add \$16384, %esp - 23 0000 - 23 ginsn: ADD %r7, 16384, %r7 - 24 - 25 0036 4883C508 add \$8, %rbp - 25 ginsn: ADD %r6, 8, %r6 - 26 - 27 003a 488D05FE lea -0x2\(%rip\), %rax - 27 FFFFFF - 27 ginsn: ADD %r4, -2, %r0 - 28 0041 67488905 mov %rax, 0x2\(%eip\) - 28 02000000 - 28 ginsn: MOV %r0, \[%r4\+2\] - 29 0049 67488B05 mov -0x2\(%eip\), %rax - 29 FEFFFFFF - 29 ginsn: MOV \[%r4\+-2\], %r0 + 17 0019 408A40FE mov -0x2\(%rax\), %axl + 17 ginsn: MOV \[%r0\+-2\], %r0 + 18 001d 408A60FE mov -0x2\(%rax\), %spl + 18 ginsn: MOV \[%r0\+-2\], %r7 + 19 + 20 0021 668B40FE mov -0x2\(%rax\), %ax + 20 ginsn: MOV \[%r0\+-2\], %r0 + 21 0025 66448B40 mov -0x2\(%rax\), %r8w + 21 FE + 21 ginsn: MOV \[%r0\+-2\], %r8 + 22 002a 668B60FE mov -0x2\(%rax\), %sp + 22 ginsn: MOV \[%r0\+-2\], %r7 + 23 + 24 002e 4080C408 add \$8, %spl + 24 ginsn: OTH 0, 0, %r7 + 25 + 26 0032 8B40FE mov -0x2\(%rax\), %eax + 26 ginsn: MOV \[%r0\+-2\], %r0 + 27 0035 448B40FE mov -0x2\(%rax\), %r8d + 27 ginsn: MOV \[%r0\+-2\], %r8 + 28 + 29 0039 81C40040 add \$16384, %esp + 29 0000 + 29 ginsn: OTH 0, 0, %r7 30 - 31 0051 C3 ret - 31 ginsn: RET + 31 003f 4883C508 add \$8, %rbp + 31 ginsn: ADD %r6, 8, %r6 + 32 + 33 0043 488D05FE lea -0x2\(%rip\), %rax GAS LISTING .* - 32 .LFE0: - 32 ginsn: SYM .LFE0 - 33 .size foo, .-foo - 33 ginsn: SYM FUNC_END + 33 FFFFFF + 33 ginsn: ADD %r4, -2, %r0 + 34 004a 67488905 mov %rax, 0x2\(%eip\) + 34 02000000 + 34 ginsn: MOV %r0, \[%r4\+2\] + 35 0052 67488B05 mov -0x2\(%eip\), %rax + 35 FEFFFFFF + 35 ginsn: MOV \[%r4\+-2\], %r0 + 36 + 37 005a 4889EC mov %rbp, %rsp + 37 ginsn: MOV %r6, %r7 + 38 005d 5D pop %rbp + 38 ginsn: LOAD \[%r7\+0\], %r6 + 38 ginsn: ADD %r7, 8, %r7 + 39 005e C3 ret + 39 ginsn: RET + 40 .LFE0: + 40 ginsn: SYM .LFE0 + 41 .size foo, .-foo + 41 ginsn: SYM FUNC_END #pass diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s b/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s index 383c60f..09bf42e 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s @@ -3,23 +3,29 @@ .globl foo .type foo, @function foo: - add $8, %al - add $8, %cl - add $8, %dl - add $8, %ah - add $8, %ch - add $8, %dh - add $8, %bh - - add $8, %axl + push %rbp + mov %rsp, %rbp + + mov -0x2(%rax), %al + mov -0x2(%rax), %bl + mov -0x2(%rax), %dl + mov -0x2(%rax), %ah + mov -0x2(%rax), %ch + mov -0x2(%rax), %dh + mov -0x2(%rax), %bh + + mov -0x2(%rax), %axl + mov -0x2(%rax), %spl + + mov -0x2(%rax), %ax + mov -0x2(%rax), %r8w + mov -0x2(%rax), %sp + add $8, %spl - add $8, %ax - add $8, %r8w - add $8, %sp + mov -0x2(%rax), %eax + mov -0x2(%rax), %r8d - add $8, %eax - add $8, %r8d add $16384, %esp add $8, %rbp @@ -28,6 +34,8 @@ foo: mov %rax, 0x2(%eip) mov -0x2(%eip), %rax + mov %rbp, %rsp + pop %rbp ret .LFE0: .size foo, .-foo |