Add __clear_cache function for flushing caches to libtcc1.
Unified · Split
| @@ -66,7 +66,7 @@ NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386 · 65 unmodified lines | |||
| 66 | NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64 | 66 | NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64 |
| 67 | NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE | 67 | NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE |
| 68 | NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC | 68 | NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC |
| 69 | NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM -DWITHOUT_LIBTCC | 69 | NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM |
| 70 | NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT | 70 | NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT |
| 71 | NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI | 71 | NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI |
| 72 | NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP | 72 | NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP |
| @@ -122,6 +122,7 @@ LIBTCC1=libtcc1.a · 49 unmodified lines | |||
| 122 | else ifeq ($(ARCH),arm) | 122 | else ifeq ($(ARCH),arm) |
| 123 | NATIVE_FILES=$(ARM_FILES) | 123 | NATIVE_FILES=$(ARM_FILES) |
| 124 | PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) | 124 | PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) |
| 125 | LIBTCC1=libtcc1.a | ||
| 125 | endif | 126 | endif |
| 126 | 127 | ||
| 127 | ifeq ($(TARGETOS),Darwin) | 128 | ifeq ($(TARGETOS),Darwin) |
| @@ -24,6 +24,10 @@ ifndef TARGET · 23 unmodified lines | |||
| 24 | ifneq ($(TARGETOS),Darwin) | 24 | ifneq ($(TARGETOS),Darwin) |
| 25 | XCC = $(CC) | 25 | XCC = $(CC) |
| 26 | endif | 26 | endif |
| 27 | else | ||
| 28 | ifeq ($(ARCH),arm) | ||
| 29 | TARGET = arm | ||
| 30 | endif | ||
| 27 | endif | 31 | endif |
| 28 | endif | 32 | endif |
| 29 | endif | 33 | endif |
| @@ -41,6 +45,7 @@ cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF) · 11 unmodified lines | |||
| 41 | 45 | ||
| 42 | I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O) | 46 | I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O) |
| 43 | X86_64_O = libtcc1.o alloca86_64.o | 47 | X86_64_O = libtcc1.o alloca86_64.o |
| 48 | ARM_O = libtcc1.o | ||
| 44 | WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o | 49 | WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o |
| 45 | WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o | 50 | WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o |
| 46 | 51 | ||
| @@ -65,12 +70,18 @@ ifeq "$(TARGET)" "x86_64" · 18 unmodified lines | |||
| 65 | OBJ = $(addprefix $(DIR)/,$(X86_64_O)) | 70 | OBJ = $(addprefix $(DIR)/,$(X86_64_O)) |
| 66 | TGT = -DTCC_TARGET_X86_64 | 71 | TGT = -DTCC_TARGET_X86_64 |
| 67 | XCC ?= $(TCC) -B$(TOP) | 72 | XCC ?= $(TCC) -B$(TOP) |
| 73 | else | ||
| 74 | ifeq "$(TARGET)" "arm" | ||
| 75 | OBJ = $(addprefix $(DIR)/,$(ARM_O)) | ||
| 76 | TGT = -DTCC_TARGET_ARM | ||
| 77 | XCC ?= $(TCC) -B$(TOP) | ||
| 68 | else | 78 | else |
| 69 | $(error libtcc1.a not supported on target '$(TARGET)') | 79 | $(error libtcc1.a not supported on target '$(TARGET)') |
| 70 | endif | 80 | endif |
| 71 | endif | 81 | endif |
| 72 | endif | 82 | endif |
| 73 | endif | 83 | endif |
| 84 | endif | ||
| 74 | 85 | ||
| 75 | XFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT) | 86 | XFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT) |
| 76 | 87 | ||
| @@ -107,7 +107,7 @@ union float_long { · 106 unmodified lines | |||
| 107 | }; | 107 | }; |
| 108 | 108 | ||
| 109 | /* XXX: we don't support several builtin supports for now */ | 109 | /* XXX: we don't support several builtin supports for now */ |
| 110 | #ifndef __x86_64__ | 110 | #if !defined(__x86_64__) && !defined(__arm__) |
| 111 | 111 | ||
| 112 | /* XXX: use gcc/tcc intrinsic ? */ | 112 | /* XXX: use gcc/tcc intrinsic ? */ |
| 113 | #if defined(__i386__) | 113 | #if defined(__i386__) |
| @@ -713,6 +713,28 @@ void __clear_cache(char *beginning, char *end) · 599 unmodified lines | |||
| 713 | { | 713 | { |
| 714 | } | 714 | } |
| 715 | 715 | ||
| 716 | #elif defined(__arm__) | ||
| 717 | |||
| 718 | #define _GNU_SOURCE | ||
| 719 | #include <unistd.h> | ||
| 720 | #include <sys/syscall.h> | ||
| 721 | |||
| 722 | void __clear_cache(char *beginning, char *end) | ||
| 723 | { | ||
| 724 | /* __ARM_NR_cacheflush is kernel private and should not be used in user space. | ||
| 725 | * However, there is no ARM asm parser in tcc so we use it for now */ | ||
| 726 | #if 1 | ||
| 727 | syscall(__ARM_NR_cacheflush); | ||
| 728 | #else | ||
| 729 | __asm__ ("push {r7}\n\t" | ||
| 730 | "mov r7, #0xf0002\n\t" | ||
| 731 | "mov r2, #0\n\t" | ||
| 732 | "swi 0\n\t" | ||
| 733 | "pop {r7}\n\t" | ||
| 734 | "ret"); | ||
| 735 | #endif | ||
| 736 | } | ||
| 737 | |||
| 716 | #else | 738 | #else |
| 717 | #warning __clear_cache not defined for this architecture, avoid using tcc -run | 739 | #warning __clear_cache not defined for this architecture, avoid using tcc -run |
| 718 | #endif | 740 | #endif |