summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile12
-rw-r--r--README15
-rw-r--r--TODO1
-rw-r--r--asm/intel64/all_ops.h3
-rw-r--r--asm/intel64/nop.cpp11
-rw-r--r--asm/intel64/nop.h13
-rw-r--r--asm/intel64/ret.cpp12
-rw-r--r--asm/intel64/ret.h12
-rw-r--r--asm/intel64/trivials.cpp19
-rw-r--r--asm/intel64/trivials.h24
-rw-r--r--debian/control1
-rw-r--r--systemtest/config/unix.exp0
-rw-r--r--systemtest/lib/mcc.exp0
-rw-r--r--systemtest/mcc-compile.tests/compile.exp1
-rw-r--r--systemtest/mcc-execute.tests/exitcodes.exp18
-rw-r--r--systemtest/mcc-execute.tests/test.cpp1
-rw-r--r--systemtest/mcc-execute.tests/test1.cpp1
17 files changed, 90 insertions, 54 deletions
diff --git a/Makefile b/Makefile
index 4487102..0688f4a 100644
--- a/Makefile
+++ b/Makefile
@@ -57,9 +57,8 @@ PROGSRC=\
asm/intel64/jmp.cpp \
asm/intel64/mov.cpp \
asm/intel64/mul.cpp \
- asm/intel64/nop.cpp \
- asm/intel64/ret.cpp \
asm/intel64/sub.cpp \
+ asm/intel64/trivials.cpp \
asm/intel64/xor.cpp \
asm/intel64/codes.cpp \
asm/intel64/encode.cpp \
@@ -99,6 +98,11 @@ SRC=$(PROGSRC) mcc.cpp
all: test-$(PROJECTNAME) mcc
./test-$(PROJECTNAME) --gtest_filter='CppTest.compile'
+systemtest:
+ #./mcc systemtest/mcc-execute.tests/test.cpp
+ ./mcc systemtest/mcc-execute.tests/test1.cpp
+ runtest --all --srcdir systemtest --tool mcc
+
# testsuite ----------------------------------------------
test-$(PROJECTNAME): $(TESTSRC:.cpp=.o)
$(CXX) $(CXXFLAGS) $^ $(LIBS) -o $@
@@ -127,12 +131,14 @@ ADD_DEP=Makefile
clean:
-rm -f test-$(PROJECTNAME) mcc tempfile.txt
-find . -name '*.o' -o -name '*.d' -o -name '*.gcno' -o -name '*.gcda' | xargs rm -f
+ -rm -f systemtest/mcc-execute.tests/test1
+ -rm -f *.log *.sum
zip: clean
-rm -f ../$(PROJECTNAME).zip
zip -r ../$(PROJECTNAME).zip *
ls -l ../$(PROJECTNAME).zip
-.PHONY: clean all zip dep
+.PHONY: clean all zip dep systemtest
-include $(wildcard $(SRC:.cpp=.d))
diff --git a/README b/README
new file mode 100644
index 0000000..a2a3e09
--- /dev/null
+++ b/README
@@ -0,0 +1,15 @@
+MCC - Mini Compiler Collection
+==============================
+
+Build
+-----
+
+make clean - Clean all
+make - Build all
+make systemtest - Run all system tests
+
+Directories
+-----------
+
+tests/ : Unit tests
+systemtest/ : System tests with dejagnu
diff --git a/TODO b/TODO
index a2cf6aa..5399bae 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,4 @@
Asm: Register indirection
-test: expect/dejagnu
cpp.cpp: eval w/ Data vs. Node
encode.cpp: support temporaries
diff --git a/asm/intel64/all_ops.h b/asm/intel64/all_ops.h
index 82f518f..c41734c 100644
--- a/asm/intel64/all_ops.h
+++ b/asm/intel64/all_ops.h
@@ -10,7 +10,6 @@
#include "jmp.h"
#include "mov.h"
#include "mul.h"
-#include "nop.h"
-#include "ret.h"
#include "sub.h"
+#include "trivials.h"
#include "xor.h"
diff --git a/asm/intel64/nop.cpp b/asm/intel64/nop.cpp
deleted file mode 100644
index 2d99278..0000000
--- a/asm/intel64/nop.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "nop.h"
-
-#include <asm/assembler.h>
-
-namespace {
-
-bool registered { registerOp("nop", [](Asm::Args& args) -> std::shared_ptr<Op>{
- return std::make_shared<Op_nop>();
- }) };
-
-}
diff --git a/asm/intel64/nop.h b/asm/intel64/nop.h
deleted file mode 100644
index 233b2ef..0000000
--- a/asm/intel64/nop.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// No Operation
-
-#pragma once
-
-#include <asm/chunk.h>
-
-class Op_nop: public OpSimple
-{
-public:
- Op_nop() : OpSimple({ 0x90 }) {}
-
-};
-
diff --git a/asm/intel64/ret.cpp b/asm/intel64/ret.cpp
deleted file mode 100644
index c42ad8a..0000000
--- a/asm/intel64/ret.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "ret.h"
-
-#include <asm/assembler.h>
-
-namespace {
-
-bool registered { registerOp("ret", [](Asm::Args& args) -> std::shared_ptr<Op>{
- return std::make_shared<Op_ret>();
- }) };
-
-}
-
diff --git a/asm/intel64/ret.h b/asm/intel64/ret.h
deleted file mode 100644
index 7e7f68c..0000000
--- a/asm/intel64/ret.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Return from procedure
-
-#pragma once
-
-#include <asm/chunk.h>
-
-class Op_ret: public OpSimple
-{
-public:
- Op_ret() : OpSimple({ 0xC3 }) {} // near return; TODO: far return is 0xCB
-};
-
diff --git a/asm/intel64/trivials.cpp b/asm/intel64/trivials.cpp
new file mode 100644
index 0000000..dd89ecd
--- /dev/null
+++ b/asm/intel64/trivials.cpp
@@ -0,0 +1,19 @@
+#include "trivials.h"
+
+#include <asm/assembler.h>
+
+namespace {
+
+bool registered {
+ registerOp("nop", [](Asm::Args& args) -> std::shared_ptr<Op>{
+ return std::make_shared<Op_nop>();
+ }) &&
+ registerOp("ret", [](Asm::Args& args) -> std::shared_ptr<Op>{
+ return std::make_shared<Op_ret>();
+ }) &&
+ registerOp("syscall", [](Asm::Args& args) -> std::shared_ptr<Op>{
+ return std::make_shared<Op_syscall>();
+ })
+};
+
+}
diff --git a/asm/intel64/trivials.h b/asm/intel64/trivials.h
new file mode 100644
index 0000000..72ea3f8
--- /dev/null
+++ b/asm/intel64/trivials.h
@@ -0,0 +1,24 @@
+// Trivial Operations, without arguments
+
+#pragma once
+
+#include <asm/chunk.h>
+
+// No Operation
+class Op_nop: public OpSimple
+{
+public: Op_nop() : OpSimple({ 0x90 }) {}
+};
+
+// Return from procedure
+class Op_ret: public OpSimple
+{
+public: Op_ret() : OpSimple({ 0xC3 }) {} // near return; TODO: far return is 0xCB
+};
+
+// Syscall
+class Op_syscall: public OpSimple
+{
+public: Op_syscall() : OpSimple({ 0x0F, 0x05 }) {}
+};
+
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..181df4a
--- /dev/null
+++ b/debian/control
@@ -0,0 +1 @@
+Depends: dejagnu, expect
diff --git a/systemtest/config/unix.exp b/systemtest/config/unix.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/systemtest/config/unix.exp
diff --git a/systemtest/lib/mcc.exp b/systemtest/lib/mcc.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/systemtest/lib/mcc.exp
diff --git a/systemtest/mcc-compile.tests/compile.exp b/systemtest/mcc-compile.tests/compile.exp
new file mode 100644
index 0000000..7866d6f
--- /dev/null
+++ b/systemtest/mcc-compile.tests/compile.exp
@@ -0,0 +1 @@
+# https://www.embecosm.com/appnotes/ean8/ean8-howto-dejagnu-1.0.html
diff --git a/systemtest/mcc-execute.tests/exitcodes.exp b/systemtest/mcc-execute.tests/exitcodes.exp
new file mode 100644
index 0000000..6e8b632
--- /dev/null
+++ b/systemtest/mcc-execute.tests/exitcodes.exp
@@ -0,0 +1,18 @@
+# https://www.embecosm.com/appnotes/ean8/ean8-howto-dejagnu-1.0.html
+
+spawn systemtest/mcc-execute.tests/test1
+
+expect eof
+
+lassign [wait] pid spawnid os_error_flag value
+
+if {$os_error_flag == 0} {
+ if {$value == 3} {
+ pass "exit status: $value"
+ } else {
+ fail "exit status: $value"
+ }
+} else {
+ fail "errno: $value"
+}
+
diff --git a/systemtest/mcc-execute.tests/test.cpp b/systemtest/mcc-execute.tests/test.cpp
new file mode 100644
index 0000000..40cbb54
--- /dev/null
+++ b/systemtest/mcc-execute.tests/test.cpp
@@ -0,0 +1 @@
+int main() { return 1; }
diff --git a/systemtest/mcc-execute.tests/test1.cpp b/systemtest/mcc-execute.tests/test1.cpp
new file mode 100644
index 0000000..3a03f6f
--- /dev/null
+++ b/systemtest/mcc-execute.tests/test1.cpp
@@ -0,0 +1 @@
+int main() { return 1 + 2; }