Put BaldrMonkey-specific behavior under a setting.

BaldrMonkey will need to enable allones_funcaddrs.
This commit is contained in:
Dan Gohman
2017-10-28 07:12:46 -07:00
parent 6fc45b070a
commit cb805f704d
8 changed files with 99 additions and 11 deletions

View File

@@ -0,0 +1,25 @@
; binary emission of 32-bit code.
test binemit
set is_compressed
set allones_funcaddrs
isa intel haswell
; The binary encodings can be verified with the command:
;
; sed -ne 's/^ *; asm: *//p' filetests/isa/intel/allones_funcaddrs32.cton | llvm-mc -show-encoding -triple=i386
;
; Tests from binary32.cton affected by allones_funcaddrs.
function %I32() {
fn0 = function %foo()
sig0 = ()
ebb0:
; asm: movl $-1, %ecx
[-,%rcx] v400 = func_addr.i32 fn0 ; bin: b9 Abs4(fn0) ffffffff
; asm: movl $-1, %esi
[-,%rsi] v401 = func_addr.i32 fn0 ; bin: be Abs4(fn0) ffffffff
return ; bin: c3
}

View File

@@ -0,0 +1,28 @@
; binary emission of 64-bit code.
test binemit
set is_64bit
set is_compressed
set allones_funcaddrs
isa intel haswell
; The binary encodings can be verified with the command:
;
; sed -ne 's/^ *; asm: *//p' filetests/isa/intel/allones_funcaddrs64.cton | llvm-mc -show-encoding -triple=x86_64
;
; Tests from binary64.cton affected by allones_funcaddrs.
function %I64() {
fn0 = function %foo()
sig0 = ()
ebb0:
; asm: movabsq $-1, %rcx
[-,%rcx] v400 = func_addr.i64 fn0 ; bin: 48 b9 Abs8(fn0) ffffffffffffffff
; asm: movabsq $-1, %rsi
[-,%rsi] v401 = func_addr.i64 fn0 ; bin: 48 be Abs8(fn0) ffffffffffffffff
; asm: movabsq $-1, %r10
[-,%r10] v402 = func_addr.i64 fn0 ; bin: 49 ba Abs8(fn0) ffffffffffffffff
return ; bin: c3
}

View File

@@ -343,9 +343,9 @@ ebb0:
call fn0() ; bin: e8 PCRel4(fn0) 00000000 call fn0() ; bin: e8 PCRel4(fn0) 00000000
; asm: movl $-1, %ecx ; asm: movl $-1, %ecx
[-,%rcx] v400 = func_addr.i32 fn0 ; bin: b9 Abs4(fn0) ffffffff [-,%rcx] v400 = func_addr.i32 fn0 ; bin: b9 Abs4(fn0) 00000000
; asm: movl $-1, %esi ; asm: movl $-1, %esi
[-,%rsi] v401 = func_addr.i32 fn0 ; bin: be Abs4(fn0) ffffffff [-,%rsi] v401 = func_addr.i32 fn0 ; bin: be Abs4(fn0) 00000000
; asm: call *%ecx ; asm: call *%ecx
call_indirect sig0, v400() ; bin: ff d1 call_indirect sig0, v400() ; bin: ff d1

View File

@@ -430,11 +430,11 @@ ebb0:
call fn0() ; bin: e8 PCRel4(fn0) 00000000 call fn0() ; bin: e8 PCRel4(fn0) 00000000
; asm: movabsq $-1, %rcx ; asm: movabsq $-1, %rcx
[-,%rcx] v400 = func_addr.i64 fn0 ; bin: 48 b9 Abs8(fn0) ffffffffffffffff [-,%rcx] v400 = func_addr.i64 fn0 ; bin: 48 b9 Abs8(fn0) 0000000000000000
; asm: movabsq $-1, %rsi ; asm: movabsq $-1, %rsi
[-,%rsi] v401 = func_addr.i64 fn0 ; bin: 48 be Abs8(fn0) ffffffffffffffff [-,%rsi] v401 = func_addr.i64 fn0 ; bin: 48 be Abs8(fn0) 0000000000000000
; asm: movabsq $-1, %r10 ; asm: movabsq $-1, %r10
[-,%r10] v402 = func_addr.i64 fn0 ; bin: 49 ba Abs8(fn0) ffffffffffffffff [-,%r10] v402 = func_addr.i64 fn0 ; bin: 49 ba Abs8(fn0) 0000000000000000
; asm: call *%rcx ; asm: call *%rcx
call_indirect sig0, v400() ; bin: ff d1 call_indirect sig0, v400() ; bin: ff d1

View File

@@ -69,5 +69,13 @@ spiderwasm_prologue_words = NumSetting(
pushed return address on Intel ISAs. pushed return address on Intel ISAs.
""") """)
#
# BaldrMonkey requires that not-yet-relocated function addresses be encoded
# as all-ones bitpatterns.
#
allones_funcaddrs = BoolSetting(
"""
Emit not-yet-relocated function addresses as all-ones bit patterns.
""")
group.close(globals()) group.close(globals())

View File

@@ -2,7 +2,7 @@
Intel Encodings. Intel Encodings.
""" """
from __future__ import absolute_import from __future__ import absolute_import
from cdsl.predicates import IsUnsignedInt from cdsl.predicates import IsUnsignedInt, Not
from base import instructions as base from base import instructions as base
from base.formats import UnaryImm from base.formats import UnaryImm
from .defs import I32, I64 from .defs import I32, I64
@@ -11,6 +11,7 @@ from . import settings as cfg
from . import instructions as x86 from . import instructions as x86
from .legalize import intel_expand from .legalize import intel_expand
from base.legalize import narrow, expand from base.legalize import narrow, expand
from base.settings import allones_funcaddrs
from .settings import use_sse41 from .settings import use_sse41
try: try:
@@ -260,8 +261,15 @@ enc_both(base.regspill.f64, r.frsp32, 0x66, 0x0f, 0xd6)
# Function addresses. # Function addresses.
# #
I32.enc(base.func_addr.i32, *r.fnaddr4(0xb8)) I32.enc(base.func_addr.i32, *r.fnaddr4(0xb8),
I64.enc(base.func_addr.i64, *r.fnaddr8.rex(0xb8, w=1)) isap=Not(allones_funcaddrs))
I64.enc(base.func_addr.i64, *r.fnaddr8.rex(0xb8, w=1),
isap=Not(allones_funcaddrs))
I32.enc(base.func_addr.i32, *r.allones_fnaddr4(0xb8),
isap=allones_funcaddrs)
I64.enc(base.func_addr.i64, *r.allones_fnaddr8.rex(0xb8, w=1),
isap=allones_funcaddrs)
# #
# Call/return # Call/return

View File

@@ -478,8 +478,7 @@ fnaddr4 = TailRecipe(
emit=''' emit='''
PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink); PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink);
sink.reloc_func(RelocKind::Abs4.into(), func_ref); sink.reloc_func(RelocKind::Abs4.into(), func_ref);
// Write the immediate as `!0` for the benefit of BaldrMonkey. sink.put4(0);
sink.put4(!0);
''') ''')
# XX+rd iq with Abs8 function relocation. # XX+rd iq with Abs8 function relocation.
@@ -488,6 +487,25 @@ fnaddr8 = TailRecipe(
emit=''' emit='''
PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink); PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink);
sink.reloc_func(RelocKind::Abs8.into(), func_ref); sink.reloc_func(RelocKind::Abs8.into(), func_ref);
sink.put8(0);
''')
# Similar to fnaddr4, but writes !0 (this is used by BaldrMonkey).
allones_fnaddr4 = TailRecipe(
'allones_fnaddr4', FuncAddr, size=4, ins=(), outs=GPR,
emit='''
PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink);
sink.reloc_func(RelocKind::Abs4.into(), func_ref);
// Write the immediate as `!0` for the benefit of BaldrMonkey.
sink.put4(!0);
''')
# Similar to fnaddr8, but writes !0 (this is used by BaldrMonkey).
allones_fnaddr8 = TailRecipe(
'allones_fnaddr8', FuncAddr, size=8, ins=(), outs=GPR,
emit='''
PUT_OP(bits | (out_reg0 & 7), rex1(out_reg0), sink);
sink.reloc_func(RelocKind::Abs8.into(), func_ref);
// Write the immediate as `!0` for the benefit of BaldrMonkey. // Write the immediate as `!0` for the benefit of BaldrMonkey.
sink.put8(!0); sink.put8(!0);
''') ''')

View File

@@ -352,7 +352,8 @@ mod tests {
enable_float = true\n\ enable_float = true\n\
enable_simd = true\n\ enable_simd = true\n\
enable_atomics = true\n\ enable_atomics = true\n\
spiderwasm_prologue_words = 0\n" spiderwasm_prologue_words = 0\n\
allones_funcaddrs = false\n"
); );
assert_eq!(f.opt_level(), super::OptLevel::Default); assert_eq!(f.opt_level(), super::OptLevel::Default);
assert_eq!(f.enable_simd(), true); assert_eq!(f.enable_simd(), true);