diff --git a/Dockerfile b/Dockerfile
index 6b1bb3b77..895c6d1dc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -48,7 +48,7 @@ ARG MACHINE_EMULATOR_VERSION=0.0.0
ARG TARGETARCH
RUN make install-tests
-RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt install -y \
+RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y \
./cartesi-machine-v${MACHINE_EMULATOR_VERSION}_${TARGETARCH}.deb \
&& rm -rf /var/lib/apt/lists/*
@@ -62,7 +62,7 @@ ARG TARGETARCH
COPY --from=installer \
/usr/src/emulator/cartesi-machine-v${MACHINE_EMULATOR_VERSION}_${TARGETARCH}.deb \
cartesi-machine.deb
-RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt install -y \
+RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y \
./cartesi-machine.deb \
&& rm -rf /var/lib/apt/lists/* \
&& rm cartesi-machine.deb
diff --git a/Makefile b/Makefile
index 31290829b..2b6134afa 100644
--- a/Makefile
+++ b/Makefile
@@ -14,14 +14,15 @@
# with this program (see COPYING). If not, see .
#
-UNAME:=$(shell uname)
+TARGET_OS?=$(shell uname)
+export TARGET_OS
# Install settings
-ARCH:= $(shell dpkg --print-architecture 2>/dev/null || echo amd64)
+DEB_ARCH:= $(shell dpkg --print-architecture 2>/dev/null || echo amd64)
PREFIX= /usr
MACHINE_EMULATOR_VERSION:= $(shell make -sC src version)
MACHINE_EMULATOR_SO_VERSION:= $(shell make -sC src so-version)
-DEB_FILENAME= cartesi-machine-v$(MACHINE_EMULATOR_VERSION)_$(ARCH).deb
+DEB_FILENAME= cartesi-machine-v$(MACHINE_EMULATOR_VERSION)_$(DEB_ARCH).deb
BIN_RUNTIME_PATH= $(PREFIX)/bin
LIB_RUNTIME_PATH= $(PREFIX)/lib
DOC_RUNTIME_PATH= $(PREFIX)/doc/cartesi-machine
@@ -29,7 +30,7 @@ SHARE_RUNTIME_PATH= $(PREFIX)/share/cartesi-machine
IMAGES_RUNTIME_PATH= $(SHARE_RUNTIME_PATH)/images
LUA_RUNTIME_CPATH= $(PREFIX)/lib/lua/5.4
LUA_RUNTIME_PATH= $(PREFIX)/share/lua/5.4
-INSTALL_PLAT = install-$(UNAME)
+INSTALL_PLAT = install-$(TARGET_OS)
LIBCARTESI_Darwin=libcartesi.dylib
LIBCARTESI_Linux=libcartesi.so
@@ -54,10 +55,11 @@ INC_INSTALL_PATH:= $(DESTDIR)$(PREFIX)/include/cartesi-machine
INSTALL= cp -RP
CHMOD_EXEC= chmod 0755
CHMOD_DATA= chmod 0644
-STRIP_EXEC= strip -x
+STRIP= strip
+STRIP_EXEC= $(STRIP) -x
EMU_TO_BIN= jsonrpc-remote-cartesi-machine remote-cartesi-machine merkle-tree-hash
-EMU_TO_LIB= $(LIBCARTESI_SO_$(UNAME)) $(LIBCARTESI_SO_GRPC_$(UNAME))
+EMU_TO_LIB= $(LIBCARTESI_SO_$(TARGET_OS)) $(LIBCARTESI_SO_GRPC_$(TARGET_OS))
EMU_LUA_TO_BIN= cartesi-machine.lua cartesi-machine-stored-hash.lua rollup-memory-range.lua
EMU_LUA_TEST_TO_BIN= cartesi-machine-tests.lua uarch-riscv-tests.lua
EMU_TO_LUA_PATH= cartesi/util.lua cartesi/proof.lua cartesi/gdbstub.lua
@@ -97,21 +99,18 @@ export release
export coverage
# Mac OS X specific settings
-ifeq ($(UNAME),Darwin)
-LUA_PLAT ?= macosx
+ifeq ($(TARGET_OS),Darwin)
export CC = clang
export CXX = clang++
-LUACC = "CC=$(CXX)"
LIBRARY_PATH := "export DYLD_LIBRARY_PATH="
# Linux specific settings
-else ifeq ($(UNAME),Linux)
-LUA_PLAT ?= linux
+else ifeq ($(TARGET_OS),Linux)
+export CC=gcc
+export CXX=g++
LIBRARY_PATH := "export LD_LIBRARY_PATH=$(SRCDIR)"
-LUACC = "CC=g++"
# Unknown platform
else
-LUA_PLAT ?= none
INSTALL_PLAT=
endif
@@ -292,8 +291,8 @@ install-emulator: $(BIN_INSTALL_PATH) $(LIB_INSTALL_PATH) $(LUA_INSTALL_CPATH)/c
cat tools/template/cartesi-machine-stored-hash.template | sed 's|ARG_LUA_PATH|$(LUA_RUNTIME_PATH)/?.lua|g;s|ARG_LUA_CPATH|$(LUA_RUNTIME_CPATH)/?.so|g;s|ARG_LUA_RUNTIME_PATH|$(LUA_RUNTIME_PATH)|g' > $(BIN_INSTALL_PATH)/cartesi-machine-stored-hash
cat tools/template/rollup-memory-range.template | sed 's|ARG_LUA_PATH|$(LUA_RUNTIME_PATH)/?.lua|g;s|ARG_LUA_CPATH|$(LUA_RUNTIME_CPATH)/?.so|g;s|ARG_LUA_RUNTIME_PATH|$(LUA_RUNTIME_PATH)|g' > $(BIN_INSTALL_PATH)/rollup-memory-range
cd $(BIN_INSTALL_PATH) && $(CHMOD_EXEC) $(EMU_TO_BIN) cartesi-machine cartesi-machine-stored-hash rollup-memory-range
- cd $(LIB_INSTALL_PATH) && ln -sf $(LIBCARTESI_SO_$(UNAME)) $(LIBCARTESI_$(UNAME))
- cd $(LIB_INSTALL_PATH) && ln -sf $(LIBCARTESI_SO_GRPC_$(UNAME)) $(LIBCARTESI_GRPC_$(UNAME))
+ cd $(LIB_INSTALL_PATH) && ln -sf $(LIBCARTESI_SO_$(TARGET_OS)) $(LIBCARTESI_$(TARGET_OS))
+ cd $(LIB_INSTALL_PATH) && ln -sf $(LIBCARTESI_SO_GRPC_$(TARGET_OS)) $(LIBCARTESI_GRPC_$(TARGET_OS))
cd $(LUA_INSTALL_PATH) && $(CHMOD_DATA) $(EMU_LUA_TO_BIN)
$(INSTALL) $(EMU_TO_INC) $(INC_INSTALL_PATH)
$(INSTALL) tools/gdb $(SHARE_INSTALL_PATH)/gdb
@@ -311,7 +310,7 @@ install: install-emulator install-strip $(INSTALL_PLAT)
debian-package: install
mkdir -p $(DESTDIR)/DEBIAN $(DOC_INSTALL_PATH)
$(INSTALL) COPYING $(DOC_INSTALL_PATH)/copyright
- cat tools/template/control.template | sed 's|ARG_VERSION|$(MACHINE_EMULATOR_VERSION)|g;s|ARG_ARCH|$(ARCH)|g' > $(DESTDIR)/DEBIAN/control
+ cat tools/template/control.template | sed 's|ARG_VERSION|$(MACHINE_EMULATOR_VERSION)|g;s|ARG_ARCH|$(DEB_ARCH)|g' > $(DESTDIR)/DEBIAN/control
dpkg-deb -Zxz --root-owner-group --build $(DESTDIR) $(DEB_FILENAME)
.SECONDARY: $(DOWNLOADDIR) $(DEPDIRS) $(COREPROTO)
diff --git a/README.md b/README.md
index d51abe540..b162582a8 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ Obs: Please note that Apple Clang Version number does not follow upstream LLVM/C
#### Debian Bookworm
```
-apt-get install build-essential wget git clang-tidy-15 clang-format-15 \
+sudo apt-get install build-essential wget git clang-tidy-15 clang-format-15 \
libboost1.81-dev libssl-dev \
ca-certificates automake libtool patchelf pkg-config lua5.4 liblua5.4-dev \
libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc \
@@ -87,7 +87,7 @@ $ make clean
### Install
```bash
-$ make install
+$ sudo make install PREFIX=/usr/local
```
## Running Tests
diff --git a/src/Makefile b/src/Makefile
index af2e5ee25..a4b0a1573 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -22,7 +22,7 @@ EMULATOR_VERSION_MINOR=15
EMULATOR_VERSION_PATCH=2
EMULATOR_VERSION_LABEL=
-UNAME:=$(shell uname)
+TARGET_OS?=$(shell uname)
LUA_INC:=$(shell pkg-config --cflags-only-I lua5.4)
LUA_LIB:=-llua5.4
@@ -54,7 +54,7 @@ CC_Darwin=clang
CXX_Darwin=clang++
INCS_Darwin=
-ifeq ($(UNAME),Darwin)
+ifeq ($(TARGET_OS),Darwin)
ifeq ($(MACOSX_DEPLOYMENT_TARGET),)
export MACOSX_DEPLOYMENT_TARGET := $(shell sw_vers -productVersion | sed -r "s/([[:digit:]]+)\.([[:digit:]]+)\..+/\1.\2.0/")
endif
@@ -117,24 +117,24 @@ LIBCARTESI_JSONRPC_TESTS_LDFLAGS_Linux=-Wl,-rpath,'$$ORIGIN/..'
CARTESI_EXECUTABLE_LDFLAGS_Linux=-Wl,-rpath,'$$ORIGIN/'
PROFILE_DATA_Linux=
-CC=$(CC_$(UNAME))
-CXX=$(CXX_$(UNAME))
-SOLDFLAGS:=$(SOLDFLAGS_$(UNAME)) $(GCLDFLAGS)
-PTHREAD_LIB:=$(PTHREAD_LIB_$(UNAME))
-BOOST_INC:=$(BOOST_INC_$(UNAME))
-GRPC_INC:=$(GRPC_INC_$(UNAME))
-GRPC_LIB:=$(GRPC_LIB_$(UNAME))
-PROTOBUF_INC:=$(PROTOBUF_INC_$(UNAME))
-PROTOBUF_LIB:=$(PROTOBUF_LIB_$(UNAME))
-LIBCARTESI=$(LIBCARTESI_$(UNAME))
-LIBCARTESI_LDFLAGS=$(LIBCARTESI_LDFLAGS_$(UNAME))
-LIBCARTESI_TESTS_LDFLAGS=$(LIBCARTESI_TESTS_LDFLAGS_$(UNAME))
+CC=$(CC_$(TARGET_OS))
+CXX=$(CXX_$(TARGET_OS))
+SOLDFLAGS:=$(SOLDFLAGS_$(TARGET_OS)) $(GCLDFLAGS)
+PTHREAD_LIB:=$(PTHREAD_LIB_$(TARGET_OS))
+BOOST_INC:=$(BOOST_INC_$(TARGET_OS))
+GRPC_INC:=$(GRPC_INC_$(TARGET_OS))
+GRPC_LIB:=$(GRPC_LIB_$(TARGET_OS))
+PROTOBUF_INC:=$(PROTOBUF_INC_$(TARGET_OS))
+PROTOBUF_LIB:=$(PROTOBUF_LIB_$(TARGET_OS))
+LIBCARTESI=$(LIBCARTESI_$(TARGET_OS))
+LIBCARTESI_LDFLAGS=$(LIBCARTESI_LDFLAGS_$(TARGET_OS))
+LIBCARTESI_TESTS_LDFLAGS=$(LIBCARTESI_TESTS_LDFLAGS_$(TARGET_OS))
LIBCARTESI_LIB=-L. -lcartesi-$(EMULATOR_VERSION_MAJOR).$(EMULATOR_VERSION_MINOR)
-CARTESI_EXECUTABLE_LDFLAGS=$(CARTESI_EXECUTABLE_LDFLAGS_$(UNAME))
+CARTESI_EXECUTABLE_LDFLAGS=$(CARTESI_EXECUTABLE_LDFLAGS_$(TARGET_OS))
-LIBCARTESI_GRPC=$(LIBCARTESI_GRPC_$(UNAME))
-LIBCARTESI_GRPC_LDFLAGS=$(LIBCARTESI_GRPC_LDFLAGS_$(UNAME))
-LIBCARTESI_GRPC_TESTS_LDFLAGS=$(LIBCARTESI_GRPC_TESTS_LDFLAGS_$(UNAME))
+LIBCARTESI_GRPC=$(LIBCARTESI_GRPC_$(TARGET_OS))
+LIBCARTESI_GRPC_LDFLAGS=$(LIBCARTESI_GRPC_LDFLAGS_$(TARGET_OS))
+LIBCARTESI_GRPC_TESTS_LDFLAGS=$(LIBCARTESI_GRPC_TESTS_LDFLAGS_$(TARGET_OS))
LIBCARTESI_GRPC_LIB=-L. -lcartesi_grpc-$(EMULATOR_VERSION_MAJOR).$(EMULATOR_VERSION_MINOR)
LIBCARTESI_LIBS:=
@@ -158,7 +158,7 @@ INCS= \
-I../third-party/tiny_sha3 \
-I../third-party/downloads \
-I../third-party/mongoose-7.12 \
- $(LUA_INC) $(BOOST_INC) $(PROTOBUF_INC) $(GRPC_INC) $(INCS_$(UNAME))
+ $(LUA_INC) $(BOOST_INC) $(PROTOBUF_INC) $(GRPC_INC) $(INCS_$(TARGET_OS))
ifeq ($(dump),yes)
#DEFS+=-DDUMP_ILLEGAL_INSN_EXCEPTIONS
@@ -199,16 +199,18 @@ DEFS+=-DNDEBUG
## Mongoose log is disabled because it generates code using __FILE__ macro,
## which is reported as an error when packaging in some Linux distributions.
MONGOOSE_DEFS+=-DMG_ENABLE_LOG=0
-# Disable jump tables, because it degrades the instruction decoding performance in the interpret loop,
-# since it generates a memory indirection that has a high cost in opcode switches.
-OPTFLAGS+=-fno-jump-tables
ifneq (,$(filter gcc,$(CC)))
# The following flag helps GCC to eliminate more redundant computations in the interpret loop,
# saving some host instructions and improving performance.
# This flag is usually enabled by default at -O3,
# but we don't use -O3 because it enables some other flags that are not worth for the interpreter.
OPTFLAGS+=-fgcse-after-reload -fpredictive-commoning -fsplit-paths -ftree-partial-pre
+else ifneq (,$(filter emcc,$(CC)))
+OPTFLAGS+=-O3
endif
+# Disable jump tables, because it degrades the instruction decoding performance in the interpret loop,
+# since it generates a memory indirection that has a high cost in opcode switches.
+OPTFLAGS+=-fno-jump-tables
endif
# Link time optimizations
@@ -268,9 +270,9 @@ EMPTY:=
SPACE:=$(EMPTY) $(EMPTY)
CLANG_TIDY_HEADER_FILTER=$(PWD)/($(subst $(SPACE),|,$(LINTER_HEADERS)))
-CXXFLAGS+=$(OPTFLAGS) -std=c++17 -fvisibility=hidden -fPIC -MMD $(CC_MARCH) $(INCS) $(GCFLAGS) $(UBFLAGS) $(DEFS) $(WARNS) $(MYCFLAGS)
-CFLAGS+=$(OPTFLAGS) -std=gnu99 -fvisibility=hidden -fPIC -MMD $(CC_MARCH) $(INCS) $(GCFLAGS) $(UBFLAGS) $(DEFS) $(WARNS) $(MYCFLAGS)
-LDFLAGS+=$(UBFLAGS) $(MYLDFLAGS)
+CXXFLAGS+=$(OPTFLAGS) -std=c++17 -fvisibility=hidden -fPIC -MMD $(CC_MARCH) $(INCS) $(GCFLAGS) $(UBFLAGS) $(DEFS) $(WARNS)
+CFLAGS+=$(OPTFLAGS) -std=gnu99 -fvisibility=hidden -fPIC -MMD $(CC_MARCH) $(INCS) $(GCFLAGS) $(UBFLAGS) $(DEFS) $(WARNS)
+LDFLAGS+=$(UBFLAGS)
COVERAGE_WORKLOAD=\
dhrystone 100; \
@@ -295,6 +297,10 @@ $(error invalid value for COVERAGE_TOOLCHAIN: $(COVERAGE_TOOLCHAIN))
endif
endif
+CXXFLAGS+=$(MYCXXFLAGS)
+CFLAGS+=$(MYCFLAGS)
+LDFLAGS+=$(MYLDFLAGS)
+
all: luacartesi grpc hash c-api jsonrpc-remote-cartesi-machine
.PHONY: all generate use clean test lint format format-lua check-format check-format-lua luacartesi grpc hash c-api compile_flags.txt
@@ -501,7 +507,7 @@ $(PROFILE_DATA_Darwin):
use: CXXFLAGS += -fprofile-use -Wno-missing-profile
use: LDFLAGS += -fprofile-use
-use: $(PROFILE_DATA_$(UNAME)) luacartesi
+use: $(PROFILE_DATA_$(TARGET_OS)) luacartesi
compile_flags.txt:
@echo "$(CXXFLAGS)" "-xc++" | sed -e $$'s/ \{1,\}/\\\n/g' | grep -v "MMD" > $@
@@ -757,7 +763,7 @@ clean-objs:
@rm -f *.o *.d
clean-libcartesi: clean-objs
- @rm -f $(LIBCARTESI) $(LIBCARTESI_GRPC) cartesi.so cartesi/grpc.so cartesi/jsonrpc.so
+ @rm -f *.so *.a cartesi/*.so cartesi/*.a
clean-executables:
@rm -f jsonrpc-remote-cartesi-machine remote-cartesi-machine merkle-tree-hash
diff --git a/src/interpret.cpp b/src/interpret.cpp
index 048347e2a..d2c9db2c8 100644
--- a/src/interpret.cpp
+++ b/src/interpret.cpp
@@ -5504,6 +5504,7 @@ static FORCE_INLINE fetch_status fetch_insn(STATE_ACCESS &a, uint64_t &pc, uint3
/// \brief Checks that false brk is consistent with rest of state
template
static void assert_no_brk(STATE_ACCESS &a) {
+ (void) a;
assert(get_pending_irq_mask(a) == 0); // LCOV_EXCL_LINE
assert(a.read_iflags_X() == 0); // LCOV_EXCL_LINE
assert(a.read_iflags_Y() == 0); // LCOV_EXCL_LINE