fixes #23114; Nim v2 regression emit / asm var param dereference inconsistency (#24547)

fixes #23114

As in https://github.com/nim-lang/Nim/pull/22074, expressions in
bracketed emit are strictly typechecked, this PR applies the same check
for symbols in asm statements in order to keep them consistent.

(cherry picked from commit 3c4246dd24)
This commit is contained in:
ringabout
2024-12-25 16:23:25 +08:00
committed by narimiran
parent 3054cbe422
commit 40476fa24f
5 changed files with 62 additions and 1 deletions

View File

@@ -17,6 +17,8 @@ rounding guarantees (via the
- Unknown warnings and hints now gives warnings `warnUnknownNotes` instead of
errors.
- With `-d:nimPreviewAsmSemSymbol`, backticked symbols are type checked in the `asm/emit` statements.
## Standard library additions and changes
[//]: # "Additions:"

View File

@@ -10,6 +10,7 @@ define:nimPreviewProcConversion
define:nimPreviewRangeDefault
define:nimPreviewNonVarDestructor
define:nimPreviewCheckedClose
define:nimPreviewAsmSemSymbol
threads:off
#import:"$projectpath/testability"

View File

@@ -637,7 +637,10 @@ proc semAsmOrEmit*(con: PContext, n: PNode, marker: char): PNode =
# XXX what to do here if 'amb' is true?
if e != nil:
incl(e.flags, sfUsed)
result.add newSymNode(e)
if isDefined(con.config, "nimPreviewAsmSemSymbol"):
result.add con.semExprWithType(con, newSymNode(e), {efTypeAllowed})
else:
result.add newSymNode(e)
else:
result.add newStrNode(nkStrLit, sub)
else:

54
tests/compiler/tasm2.nim Normal file
View File

@@ -0,0 +1,54 @@
discard """
targets: "c cpp"
disabled: "arm64"
"""
import std/strutils
block: # bug #23114
func ccopy_x86_asm(ctl: uint64, x: var uint64, y: uint64) =
asm """
testq %[ctl], %[ctl]
cmovnzq %[y], %[x]
: [x] "+r" (`x`)
: [ctl] "r" (`ctl`), [y] "r" (`y`)
: "cc"
"""
func ccopy_x86_emit(ctl: uint64, x: var uint64, y: uint64) =
{.emit:[
"""
asm volatile(
"testq %[ctl], %[ctl]\n"
"cmovnzq %[y], %[x]\n"
: [x] "+r" (""", x, """)
: [ctl] "r" (""", ctl, """), [y] "r" (""", y, """)
: "cc"
);"""].}
let x = 0x1111111'u64
let y = 0xFFFFFFF'u64
block:
let ctl = 1'u64
var a0 = x
ctl.ccopy_x86_asm(a0, y)
var a1 = x
ctl.ccopy_x86_emit(a1, y)
doAssert a0.toHex() == "000000000FFFFFFF"
doAssert a0 == a1
block:
let ctl = 0'u64
var a0 = x
ctl.ccopy_x86_asm(a0, y)
var a1 = x
ctl.ccopy_x86_emit(a1, y)
doAssert a0.toHex() == "0000000001111111"
doAssert a0 == a1

View File

@@ -38,6 +38,7 @@ switch("define", "nimPreviewHashRef")
switch("define", "nimPreviewRangeDefault")
switch("define", "nimPreviewNonVarDestructor")
switch("define", "nimPreviewCheckedClose")
switch("define", "nimPreviewAsmSemSymbol")
switch("warningAserror", "UnnamedBreak")
when not defined(testsConciseTypeMismatch):