@@ -325,9 +325,91 @@ CHECKFLAGS += $(CBMC_FLAG_UNSIGNED_OVERFLOW_CHECK)
325325# initialized with unconstrained values.
326326NONDET_STATIC ?=
327327
328+ # Target platform for CBMC/goto-cc. Leave unset to preserve the historic
329+ # host-default model.
330+ CBMC_TARGET ?=
331+ CBMC_TARGET_CC ?=
332+ CBMC_TARGET_GOTO_FLAGS ?=
333+ CBMC_TARGET_CBMC_FLAGS ?=
334+ CBMC_TARGET_INSTRUMENT_ENV ?=
335+ CBMC_TARGET_GCC_AS_GCC_DIR ?=
336+ CBMC_TARGET_HOST_PATH ?= $(shell printf '% s' "$$PATH")
337+ CBMC_TARGET_POINTER_BYTES ?= 8
338+ CBMC_TARGET_SIZE_T_BYTES ?= 8
339+ CBMC_TARGET_LONG_BYTES ?= 8
340+
341+ ifeq ($(strip $(CBMC_TARGET ) ) ,)
342+ ifeq ($(strip $(CBMC_TARGET_CC)),)
343+ CBMC_TARGET_CC = $(CC )
344+ endif
345+ else ifeq ($(CBMC_TARGET),i386-linux)
346+ ifeq ($(strip $(CBMC_TARGET_CC)),)
347+ CBMC_TARGET_CC = i686-unknown-linux-gnu-gcc
348+ endif
349+ CBMC_TARGET_GOTO_FLAGS = --i386-linux
350+ CBMC_TARGET_CBMC_FLAGS = --i386-linux
351+ ifeq ($(strip $(CBMC_TARGET_GCC_AS_GCC_DIR)),)
352+ CBMC_TARGET_GCC_AS_GCC_DIR = $(PROOF_ROOT ) /tools/i686-gcc-as-gcc
353+ endif
354+ CBMC_TARGET_INSTRUMENT_ENV = PATH=$(CBMC_TARGET_GCC_AS_GCC_DIR ) :$(CBMC_TARGET_HOST_PATH ) CC=$(CBMC_TARGET_CC ) GCC=$(CBMC_TARGET_CC )
355+ CBMC_TARGET_POINTER_BYTES = 4
356+ CBMC_TARGET_SIZE_T_BYTES = 4
357+ CBMC_TARGET_LONG_BYTES = 4
358+ else ifeq ($(CBMC_TARGET),x86_64-linux)
359+ ifeq ($(strip $(CBMC_TARGET_CC)),)
360+ CBMC_TARGET_CC = x86_64-unknown-linux-gnu-gcc
361+ endif
362+ CBMC_TARGET_CBMC_FLAGS = --arch x86_64 --os linux --LP64
363+ ifeq ($(strip $(CBMC_TARGET_GCC_AS_GCC_DIR)),)
364+ CBMC_TARGET_GCC_AS_GCC_DIR = $(PROOF_ROOT ) /tools/x86_64-gcc-as-gcc
365+ endif
366+ CBMC_TARGET_INSTRUMENT_ENV = PATH=$(CBMC_TARGET_GCC_AS_GCC_DIR ) :$(CBMC_TARGET_HOST_PATH ) CC=$(CBMC_TARGET_CC ) GCC=$(CBMC_TARGET_CC )
367+ CBMC_TARGET_POINTER_BYTES = 8
368+ CBMC_TARGET_SIZE_T_BYTES = 8
369+ CBMC_TARGET_LONG_BYTES = 8
370+ else ifeq ($(CBMC_TARGET),aarch64-linux)
371+ ifeq ($(strip $(CBMC_TARGET_CC)),)
372+ CBMC_TARGET_CC = aarch64-unknown-linux-gnu-gcc
373+ endif
374+ CBMC_TARGET_CBMC_FLAGS = --arch arm64 --os linux --LP64
375+ ifeq ($(strip $(CBMC_TARGET_GCC_AS_GCC_DIR)),)
376+ CBMC_TARGET_GCC_AS_GCC_DIR = $(PROOF_ROOT ) /tools/aarch64-gcc-as-gcc
377+ endif
378+ CBMC_TARGET_INSTRUMENT_ENV = PATH=$(CBMC_TARGET_GCC_AS_GCC_DIR ) :$(CBMC_TARGET_HOST_PATH ) CC=$(CBMC_TARGET_CC ) GCC=$(CBMC_TARGET_CC )
379+ CBMC_TARGET_POINTER_BYTES = 8
380+ CBMC_TARGET_SIZE_T_BYTES = 8
381+ CBMC_TARGET_LONG_BYTES = 8
382+ else ifeq ($(CBMC_TARGET),riscv64-linux)
383+ ifeq ($(strip $(CBMC_TARGET_CC)),)
384+ CBMC_TARGET_CC = riscv64-unknown-linux-gnu-gcc
385+ endif
386+ CBMC_TARGET_CBMC_FLAGS = --arch riscv64 --os linux --LP64
387+ ifeq ($(strip $(CBMC_TARGET_GCC_AS_GCC_DIR)),)
388+ CBMC_TARGET_GCC_AS_GCC_DIR = $(PROOF_ROOT ) /tools/riscv64-gcc-as-gcc
389+ endif
390+ CBMC_TARGET_INSTRUMENT_ENV = PATH=$(CBMC_TARGET_GCC_AS_GCC_DIR ) :$(CBMC_TARGET_HOST_PATH ) CC=$(CBMC_TARGET_CC ) GCC=$(CBMC_TARGET_CC )
391+ CBMC_TARGET_POINTER_BYTES = 8
392+ CBMC_TARGET_SIZE_T_BYTES = 8
393+ CBMC_TARGET_LONG_BYTES = 8
394+ else ifeq ($(CBMC_TARGET),ppc64le-linux)
395+ ifeq ($(strip $(CBMC_TARGET_CC)),)
396+ CBMC_TARGET_CC = powerpc64le-unknown-linux-gnu-gcc
397+ endif
398+ CBMC_TARGET_CBMC_FLAGS = --arch ppc64le --os linux --LP64
399+ ifeq ($(strip $(CBMC_TARGET_GCC_AS_GCC_DIR)),)
400+ CBMC_TARGET_GCC_AS_GCC_DIR = $(PROOF_ROOT ) /tools/ppc64le-gcc-as-gcc
401+ endif
402+ CBMC_TARGET_INSTRUMENT_ENV = PATH=$(CBMC_TARGET_GCC_AS_GCC_DIR ) :$(CBMC_TARGET_HOST_PATH ) CC=$(CBMC_TARGET_CC ) GCC=$(CBMC_TARGET_CC )
403+ CBMC_TARGET_POINTER_BYTES = 8
404+ CBMC_TARGET_SIZE_T_BYTES = 8
405+ CBMC_TARGET_LONG_BYTES = 8
406+ else
407+ $(error Unsupported CBMC_TARGET '$(CBMC_TARGET)'; expected i386-linux, x86_64-linux, aarch64-linux, riscv64-linux, ppc64le-linux, or unset)
408+ endif
409+
328410# Flags to pass to goto-cc for compilation and linking
329- COMPILE_FLAGS ?= -Wall -Werror --native-compiler $(CC )
330- LINK_FLAGS ?= -Wall -Werror
411+ COMPILE_FLAGS ?= -Wall -Werror $( CBMC_TARGET_GOTO_FLAGS ) --native-compiler $(CBMC_TARGET_CC )
412+ LINK_FLAGS ?= -Wall -Werror $( CBMC_TARGET_GOTO_FLAGS )
331413EXPORT_FILE_LOCAL_SYMBOLS ?= --export-file-local-symbols
332414
333415# During instrumentation, it adds models of C library functions
@@ -555,6 +637,7 @@ endif
555637# ###############################################################
556638# CBMC flags common to all proofs
557639CBMCFLAGS += $(CBMC_FLAG_FLUSH )
640+ CBMCFLAGS += $(CBMC_TARGET_CBMC_FLAGS )
558641CBMCFLAGS += --object-bits $(CBMC_OBJECT_BITS )
559642CBMCFLAGS += --slice-formula
560643
@@ -563,6 +646,9 @@ CBMCFLAGS += --slice-formula
563646DEFINES += -DCBMC=1
564647DEFINES += -DCBMC_OBJECT_BITS=$(CBMC_OBJECT_BITS )
565648DEFINES += -DCBMC_MAX_OBJECT_SIZE="(SIZE_MAX>>(CBMC_OBJECT_BITS+1))"
649+ DEFINES += -DCBMC_TARGET_POINTER_BYTES=$(CBMC_TARGET_POINTER_BYTES )
650+ DEFINES += -DCBMC_TARGET_SIZE_T_BYTES=$(CBMC_TARGET_SIZE_T_BYTES )
651+ DEFINES += -DCBMC_TARGET_LONG_BYTES=$(CBMC_TARGET_LONG_BYTES )
566652
567653
568654ifndef MLKEM_K
@@ -719,7 +805,7 @@ $(PROOF_GOTO)0100.goto: $(PROOF_SOURCES)
719805$(PROJECT_GOTO ) 0200.goto : $(PROJECT_GOTO ) 0100.goto
720806 $(LITANI ) add-job \
721807 --command \
722- ' $(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_REMOVE_FUNCTION_BODY) $^ $@' \
808+ ' $(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_REMOVE_FUNCTION_BODY) $^ $@' \
723809 --inputs $^ \
724810 --outputs $@ \
725811 --stdout-file $(LOGDIR ) /remove_function_body-log.txt \
@@ -742,7 +828,7 @@ $(HARNESS_GOTO)0100.goto: $(PROOF_GOTO)0100.goto $(PROJECT_GOTO)0200.goto
742828$(HARNESS_GOTO ) 0200.goto : $(HARNESS_GOTO ) 0100.goto
743829 $(LITANI ) add-job \
744830 --command \
745- ' $(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_RESTRICT_FUNCTION_POINTER) --remove-function-pointers $^ $@' \
831+ ' $(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_RESTRICT_FUNCTION_POINTER) --remove-function-pointers $^ $@' \
746832 --inputs $^ \
747833 --outputs $@ \
748834 --stdout-file $(LOGDIR ) /restrict_function_pointer-log.txt \
@@ -764,7 +850,7 @@ ifneq ($(strip $(CODE_CONTRACTS)),)
764850else
765851 $(LITANI) add-job \
766852 --command \
767- '$(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(NONDET_STATIC) $^ $@' \
853+ '$(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(NONDET_STATIC) $^ $@' \
768854 --inputs $^ \
769855 --outputs $@ \
770856 --stdout-file $(LOGDIR)/nondet_static-log.txt \
@@ -778,7 +864,7 @@ $(HARNESS_GOTO)0400.goto: $(HARNESS_GOTO)0300.goto
778864ifneq ($(strip $(USE_DYNAMIC_FRAMES ) ) ,)
779865 $(LITANI) add-job \
780866 --command \
781- '$(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(ADD_LIBRARY_FLAG) $(CBMC_OPT_CONFIG_LIBRARY) $^ $@' \
867+ '$(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(ADD_LIBRARY_FLAG) $(CBMC_OPT_CONFIG_LIBRARY) $^ $@' \
782868 --inputs $^ \
783869 --outputs $@ \
784870 --stdout-file $(LOGDIR)/linking-library-models-log.txt \
@@ -801,7 +887,7 @@ $(HARNESS_GOTO)0500.goto: $(HARNESS_GOTO)0400.goto
801887ifneq ($(strip $(USE_DYNAMIC_FRAMES ) ) ,)
802888 $(LITANI) add-job \
803889 --command \
804- '$(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(UNWIND_0500_FLAGS) $^ $@' \
890+ '$(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(UNWIND_0500_FLAGS) $^ $@' \
805891 --inputs $^ \
806892 --outputs $@ \
807893 --stdout-file $(LOGDIR)/unwind_loops-log.txt \
@@ -811,7 +897,7 @@ ifneq ($(strip $(USE_DYNAMIC_FRAMES)),)
811897else ifneq ($(strip $(CODE_CONTRACTS)),)
812898 $(LITANI) add-job \
813899 --command \
814- '$(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_UNWINDSET) $(CBMC_FLAG_UNWINDING_ASSERTIONS) $^ $@' \
900+ '$(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) $(CBMC_UNWINDSET) $(CBMC_FLAG_UNWINDING_ASSERTIONS) $^ $@' \
815901 --inputs $^ \
816902 --outputs $@ \
817903 --stdout-file $(LOGDIR)/unwind_loops-log.txt \
@@ -833,7 +919,7 @@ endif
833919$(HARNESS_GOTO ) 0600.goto : $(HARNESS_GOTO ) 0500.goto
834920 $(LITANI ) add-job \
835921 --command \
836- ' $(GOTO_INSTRUMENT) $(CBMC_USE_DYNAMIC_FRAMES) $(NONDET_STATIC) $(CBMC_VERBOSITY) $(CBMC_CHECK_FUNCTION_CONTRACTS) $(CBMC_USE_FUNCTION_CONTRACTS) $(CBMC_APPLY_LOOP_CONTRACTS) $^ $@' \
922+ ' $(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_USE_DYNAMIC_FRAMES) $(NONDET_STATIC) $(CBMC_VERBOSITY) $(CBMC_CHECK_FUNCTION_CONTRACTS) $(CBMC_USE_FUNCTION_CONTRACTS) $(CBMC_APPLY_LOOP_CONTRACTS) $^ $@' \
837923 --inputs $^ \
838924 --outputs $@ \
839925 --stdout-file $(LOGDIR ) /check_function_contracts-log.txt \
@@ -845,7 +931,7 @@ $(HARNESS_GOTO)0600.goto: $(HARNESS_GOTO)0500.goto
845931$(HARNESS_GOTO ) 0700.goto : $(HARNESS_GOTO ) 0600.goto
846932 $(LITANI ) add-job \
847933 --command \
848- ' $(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) --slice-global-inits $^ $@' \
934+ ' $(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) --slice-global-inits $^ $@' \
849935 --inputs $^ \
850936 --outputs $@ \
851937 --stdout-file $(LOGDIR ) /slice_global_inits-log.txt \
@@ -857,7 +943,7 @@ $(HARNESS_GOTO)0700.goto: $(HARNESS_GOTO)0600.goto
857943$(HARNESS_GOTO ) 0800.goto : $(HARNESS_GOTO ) 0700.goto
858944 $(LITANI ) add-job \
859945 --command \
860- ' $(GOTO_INSTRUMENT) $(CBMC_VERBOSITY) --drop-unused-functions $^ $@' \
946+ ' $(CBMC_TARGET_INSTRUMENT_ENV) $( GOTO_INSTRUMENT) $(CBMC_VERBOSITY) --drop-unused-functions $^ $@' \
861947 --inputs $^ \
862948 --outputs $@ \
863949 --stdout-file $(LOGDIR ) /drop_unused_functions-log.txt \
0 commit comments