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 | 66 | NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64 |
| 67 | 67 | NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE |
| 68 | 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 | 70 | NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT |
| 71 | 71 | NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI |
| 72 | 72 | NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP |
| @@ -122,6 +122,7 @@ LIBTCC1=libtcc1.a · 49 unmodified lines | ||
| 122 | 122 | else ifeq ($(ARCH),arm) |
| 123 | 123 | NATIVE_FILES=$(ARM_FILES) |
| 124 | 124 | PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) |
| 125 | +LIBTCC1=libtcc1.a | |
| 125 | 126 | endif |
| 126 | 127 | |
| 127 | 128 | ifeq ($(TARGETOS),Darwin) |
| @@ -24,6 +24,10 @@ ifndef TARGET · 23 unmodified lines | ||
| 24 | 24 | ifneq ($(TARGETOS),Darwin) |
| 25 | 25 | XCC = $(CC) |
| 26 | 26 | endif |
| 27 | + else | |
| 28 | + ifeq ($(ARCH),arm) | |
| 29 | + TARGET = arm | |
| 30 | + endif | |
| 27 | 31 | endif |
| 28 | 32 | endif |
| 29 | 33 | endif |
| @@ -41,6 +45,7 @@ cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF) · 11 unmodified lines | ||
| 41 | 45 | |
| 42 | 46 | I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O) |
| 43 | 47 | X86_64_O = libtcc1.o alloca86_64.o |
| 48 | +ARM_O = libtcc1.o | |
| 44 | 49 | WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o |
| 45 | 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 | 70 | OBJ = $(addprefix $(DIR)/,$(X86_64_O)) |
| 66 | 71 | TGT = -DTCC_TARGET_X86_64 |
| 67 | 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 | 78 | else |
| 69 | 79 | $(error libtcc1.a not supported on target '$(TARGET)') |
| 70 | 80 | endif |
| 71 | 81 | endif |
| 72 | 82 | endif |
| 73 | 83 | endif |
| 84 | +endif | |
| 74 | 85 | |
| 75 | 86 | XFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT) |
| 76 | 87 | |
| @@ -107,7 +107,7 @@ union float_long { · 106 unmodified lines | ||
| 107 | 107 | }; |
| 108 | 108 | |
| 109 | 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 | 112 | /* XXX: use gcc/tcc intrinsic ? */ |
| 113 | 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 | 738 | #else |
| 717 | 739 | #warning __clear_cache not defined for this architecture, avoid using tcc -run |
| 718 | 740 | #endif |