diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-22 10:45:43 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-22 10:45:43 -0700 |
| commit | dbcaebdefff26658debc29cae284ad4aa0da4c65 (patch) | |
| tree | 27821f9692d7e59bdb22aba855ff577b59fc6fd0 /chapter-sccp/src/test/java | |
| parent | 7edca9823ec8ef0aed10c88fa07ef969792aab77 (diff) | |
| download | Simple-dbcaebdefff26658debc29cae284ad4aa0da4c65.tar.gz Simple-dbcaebdefff26658debc29cae284ad4aa0da4c65.zip | |
Split out incomplete type analysis
Diffstat (limited to 'chapter-sccp/src/test/java')
| -rw-r--r-- | chapter-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/chapter-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java b/chapter-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java new file mode 100644 index 00000000..6d21ca5f --- /dev/null +++ b/chapter-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java @@ -0,0 +1,54 @@ +package com.seaofnodes.simple; + +import com.seaofnodes.simple.codegen.CodeGen; +import com.seaofnodes.simple.codegen.Encoding; +import com.seaofnodes.isa.eval.EvalArm64; +import com.seaofnodes.isa.eval.EvalRisc5; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import org.junit.Test; +import static org.junit.Assert.*; + +public class NativeAddressTest { + @Test public void testReturnedNativeAddress() throws IOException { + Path dir = Path.of("build/objs"); + Files.createDirectories(dir); + Files.writeString(dir.resolve("nativeAddress.smp"), """ + val getAbs = { -> + { i32 -> i32 } abs = "C"; + return abs; + }; + """); + Files.writeString(dir.resolve("nativeAddress.c"), """ + typedef int (*func)(int); + extern func getAbs(void); + int main(void) { + func f = getAbs(); + return f(-7) != 7 || f(9) != 9; + } + """); + TestC.run("build/objs", "nativeAddress", "", -1); + } + + @Test public void testEmulatedNativeAddress() throws IOException { + // No native call: return the address itself, patched to the emulator's + // known write entry. Both ports share Encoding's symbol lookup. + String src = "{ int -> int } write = \"C\"; return write;"; + for( String cpu : new String[]{"arm","riscv"} ) { + CodeGen code = new CodeGen(src).driver(cpu,"SystemV",null); + byte[] bits = code._encoding.bits(); + byte[] image = new byte[1<<20]; + System.arraycopy(bits,0,image,0,bits.length); + if( cpu.equals("arm") ) { + EvalArm64 eval = new EvalArm64(image,1<<16); + assertEquals(0,eval.step(100)); + assertEquals(Encoding.SENTINEL_WRITE,eval.regs[0]); + } else { + EvalRisc5 eval = new EvalRisc5(image,1<<16); + assertEquals(0,eval.step(100)); + assertEquals(Encoding.SENTINEL_WRITE,eval.regs[10]); + } + } + } +} |
