- 所有 tcc 文件/内容/宏改名为 pcc (tcc.c->pcc.c, tccelf.c->pccelf.c, libtcc.c->libpcc.c 等) - 支持架构: i386, x86_64, ARM, ARM64, RISC-V, C67 - 支持格式: PE, ELF, Mach-O, COFF - 完整预处理、代码生成、链接器、调试信息 - 构建成功: pcc.exe (x86_64 Windows) - 功能测试通过: 递归/结构体/浮点/switch/循环 - 自编译测试通过: pcc 可以编译自身
71 行
1.6 KiB
C
71 行
1.6 KiB
C
/* armflush.c - flush the instruction cache
|
|
|
|
__clear_cache is used in pccrun.c, It is a built-in
|
|
intrinsic with gcc. However pcc in order to compile
|
|
itself needs this function */
|
|
|
|
/* ------------------------------------------------------------- */
|
|
#if defined __arm__
|
|
|
|
#ifdef __TINYC__
|
|
|
|
/* syscall wrapper */
|
|
unsigned _pccsyscall(unsigned syscall_nr, ...);
|
|
|
|
/* arm-pcc supports only fake asm currently */
|
|
__asm__(
|
|
".global _pccsyscall\n"
|
|
"_pccsyscall:\n"
|
|
"push {r7, lr}\n\t"
|
|
"mov r7, r0\n\t"
|
|
"mov r0, r1\n\t"
|
|
"mov r1, r2\n\t"
|
|
"mov r2, r3\n\t"
|
|
"svc #0\n\t"
|
|
"pop {r7, pc}"
|
|
);
|
|
|
|
/* from unistd.h: */
|
|
#if defined(__thumb__) || defined(__ARM_EABI__)
|
|
# define __NR_SYSCALL_BASE 0x0
|
|
#else
|
|
# define __NR_SYSCALL_BASE 0x900000
|
|
#endif
|
|
#define __ARM_NR_BASE (__NR_SYSCALL_BASE+0x0f0000)
|
|
#define __ARM_NR_cacheflush (__ARM_NR_BASE+2)
|
|
|
|
#define syscall _pccsyscall
|
|
|
|
#else
|
|
|
|
#define _GNU_SOURCE
|
|
#include <unistd.h>
|
|
#include <sys/syscall.h>
|
|
#include <stdio.h>
|
|
|
|
#endif
|
|
|
|
/* Flushing for tccrun */
|
|
void __clear_cache(void *beginning, void *end)
|
|
{
|
|
/* __ARM_NR_cacheflush is kernel private and should not be used in user space.
|
|
* However, there is no ARM asm parser in pcc so we use it for now */
|
|
syscall(__ARM_NR_cacheflush, beginning, end, 0);
|
|
}
|
|
|
|
/* ------------------------------------------------------------- */
|
|
#elif defined __aarch64__
|
|
void __clear_cache(void *beg, void *end)
|
|
{
|
|
__arm64_clear_cache(beg, end);
|
|
}
|
|
|
|
/* ------------------------------------------------------------- */
|
|
#elif defined __riscv
|
|
void __clear_cache(void *beg, void *end)
|
|
{
|
|
__riscv64_clear_cache(beg, end);
|
|
}
|
|
|
|
#endif
|