mirror of
https://github.com/frida/tinycc
synced 2025-02-16 15:23:59 +03:00
![grischka](/assets/img/avatar_default.png)
There seems nothing wrong. With int t1 = 176401255; float f = 0.25; int t2 = t1 * f; // 176401255 * 0.25 = 44100313.75 according to the arithmetic conversion rules, the number 176401255 needs to be converted to float, and the compiler can choose either the nearest higher or nearest lower representable number "in an implementation-defined manner". Which may be 176401248 or 176401264. So as result both 44100312 and 44100313 are correct. This reverts commit 664c19ad5ef16f3463087a33ecfe5d5ac24f81ec.
349 lines
11 KiB
C
349 lines
11 KiB
C
/* keywords */
|
|
DEF(TOK_INT, "int")
|
|
DEF(TOK_VOID, "void")
|
|
DEF(TOK_CHAR, "char")
|
|
DEF(TOK_IF, "if")
|
|
DEF(TOK_ELSE, "else")
|
|
DEF(TOK_WHILE, "while")
|
|
DEF(TOK_BREAK, "break")
|
|
DEF(TOK_RETURN, "return")
|
|
DEF(TOK_FOR, "for")
|
|
DEF(TOK_EXTERN, "extern")
|
|
DEF(TOK_STATIC, "static")
|
|
DEF(TOK_UNSIGNED, "unsigned")
|
|
DEF(TOK_GOTO, "goto")
|
|
DEF(TOK_DO, "do")
|
|
DEF(TOK_CONTINUE, "continue")
|
|
DEF(TOK_SWITCH, "switch")
|
|
DEF(TOK_CASE, "case")
|
|
|
|
DEF(TOK_CONST1, "const")
|
|
DEF(TOK_CONST2, "__const") /* gcc keyword */
|
|
DEF(TOK_CONST3, "__const__") /* gcc keyword */
|
|
DEF(TOK_VOLATILE1, "volatile")
|
|
DEF(TOK_VOLATILE2, "__volatile") /* gcc keyword */
|
|
DEF(TOK_VOLATILE3, "__volatile__") /* gcc keyword */
|
|
DEF(TOK_LONG, "long")
|
|
DEF(TOK_REGISTER, "register")
|
|
DEF(TOK_SIGNED1, "signed")
|
|
DEF(TOK_SIGNED2, "__signed") /* gcc keyword */
|
|
DEF(TOK_SIGNED3, "__signed__") /* gcc keyword */
|
|
DEF(TOK_AUTO, "auto")
|
|
DEF(TOK_INLINE1, "inline")
|
|
DEF(TOK_INLINE2, "__inline") /* gcc keyword */
|
|
DEF(TOK_INLINE3, "__inline__") /* gcc keyword */
|
|
DEF(TOK_RESTRICT1, "restrict")
|
|
DEF(TOK_RESTRICT2, "__restrict")
|
|
DEF(TOK_RESTRICT3, "__restrict__")
|
|
DEF(TOK_EXTENSION, "__extension__") /* gcc keyword */
|
|
|
|
DEF(TOK_FLOAT, "float")
|
|
DEF(TOK_DOUBLE, "double")
|
|
DEF(TOK_BOOL, "_Bool")
|
|
DEF(TOK_SHORT, "short")
|
|
DEF(TOK_STRUCT, "struct")
|
|
DEF(TOK_UNION, "union")
|
|
DEF(TOK_TYPEDEF, "typedef")
|
|
DEF(TOK_DEFAULT, "default")
|
|
DEF(TOK_ENUM, "enum")
|
|
DEF(TOK_SIZEOF, "sizeof")
|
|
DEF(TOK_ATTRIBUTE1, "__attribute")
|
|
DEF(TOK_ATTRIBUTE2, "__attribute__")
|
|
DEF(TOK_ALIGNOF1, "__alignof")
|
|
DEF(TOK_ALIGNOF2, "__alignof__")
|
|
DEF(TOK_TYPEOF1, "typeof")
|
|
DEF(TOK_TYPEOF2, "__typeof")
|
|
DEF(TOK_TYPEOF3, "__typeof__")
|
|
DEF(TOK_LABEL, "__label__")
|
|
DEF(TOK_ASM1, "asm")
|
|
DEF(TOK_ASM2, "__asm")
|
|
DEF(TOK_ASM3, "__asm__")
|
|
|
|
#ifdef TCC_TARGET_ARM64
|
|
DEF(TOK_UINT128, "__uint128_t")
|
|
#endif
|
|
|
|
/*********************************************************************/
|
|
/* the following are not keywords. They are included to ease parsing */
|
|
/* preprocessor only */
|
|
DEF(TOK_DEFINE, "define")
|
|
DEF(TOK_INCLUDE, "include")
|
|
DEF(TOK_INCLUDE_NEXT, "include_next")
|
|
DEF(TOK_IFDEF, "ifdef")
|
|
DEF(TOK_IFNDEF, "ifndef")
|
|
DEF(TOK_ELIF, "elif")
|
|
DEF(TOK_ENDIF, "endif")
|
|
DEF(TOK_DEFINED, "defined")
|
|
DEF(TOK_UNDEF, "undef")
|
|
DEF(TOK_ERROR, "error")
|
|
DEF(TOK_WARNING, "warning")
|
|
DEF(TOK_LINE, "line")
|
|
DEF(TOK_PRAGMA, "pragma")
|
|
DEF(TOK___LINE__, "__LINE__")
|
|
DEF(TOK___FILE__, "__FILE__")
|
|
DEF(TOK___DATE__, "__DATE__")
|
|
DEF(TOK___TIME__, "__TIME__")
|
|
DEF(TOK___FUNCTION__, "__FUNCTION__")
|
|
DEF(TOK___VA_ARGS__, "__VA_ARGS__")
|
|
|
|
/* special identifiers */
|
|
DEF(TOK___FUNC__, "__func__")
|
|
|
|
/* special floating point values */
|
|
DEF(TOK___NAN__, "__nan__")
|
|
DEF(TOK___SNAN__, "__snan__")
|
|
DEF(TOK___INF__, "__inf__")
|
|
|
|
/* attribute identifiers */
|
|
/* XXX: handle all tokens generically since speed is not critical */
|
|
DEF(TOK_SECTION1, "section")
|
|
DEF(TOK_SECTION2, "__section__")
|
|
DEF(TOK_ALIGNED1, "aligned")
|
|
DEF(TOK_ALIGNED2, "__aligned__")
|
|
DEF(TOK_PACKED1, "packed")
|
|
DEF(TOK_PACKED2, "__packed__")
|
|
DEF(TOK_WEAK1, "weak")
|
|
DEF(TOK_WEAK2, "__weak__")
|
|
DEF(TOK_ALIAS1, "alias")
|
|
DEF(TOK_ALIAS2, "__alias__")
|
|
DEF(TOK_UNUSED1, "unused")
|
|
DEF(TOK_UNUSED2, "__unused__")
|
|
DEF(TOK_CDECL1, "cdecl")
|
|
DEF(TOK_CDECL2, "__cdecl")
|
|
DEF(TOK_CDECL3, "__cdecl__")
|
|
DEF(TOK_STDCALL1, "stdcall")
|
|
DEF(TOK_STDCALL2, "__stdcall")
|
|
DEF(TOK_STDCALL3, "__stdcall__")
|
|
DEF(TOK_FASTCALL1, "fastcall")
|
|
DEF(TOK_FASTCALL2, "__fastcall")
|
|
DEF(TOK_FASTCALL3, "__fastcall__")
|
|
|
|
DEF(TOK_MODE, "__mode__")
|
|
DEF(TOK_MODE_QI, "__QI__")
|
|
DEF(TOK_MODE_DI, "__DI__")
|
|
DEF(TOK_MODE_HI, "__HI__")
|
|
DEF(TOK_MODE_SI, "__SI__")
|
|
DEF(TOK_MODE_word, "__word__")
|
|
|
|
DEF(TOK_DLLEXPORT, "dllexport")
|
|
DEF(TOK_DLLIMPORT, "dllimport")
|
|
DEF(TOK_NORETURN1, "noreturn")
|
|
DEF(TOK_NORETURN2, "__noreturn__")
|
|
DEF(TOK_VISIBILITY1, "visibility")
|
|
DEF(TOK_VISIBILITY2, "__visibility__")
|
|
DEF(TOK_builtin_types_compatible_p, "__builtin_types_compatible_p")
|
|
DEF(TOK_builtin_choose_expr, "__builtin_choose_expr")
|
|
DEF(TOK_builtin_constant_p, "__builtin_constant_p")
|
|
DEF(TOK_builtin_frame_address, "__builtin_frame_address")
|
|
DEF(TOK_builtin_return_address, "__builtin_return_address")
|
|
DEF(TOK_builtin_expect, "__builtin_expect")
|
|
#ifdef TCC_TARGET_X86_64
|
|
#ifdef TCC_TARGET_PE
|
|
DEF(TOK_builtin_va_start, "__builtin_va_start")
|
|
#else
|
|
DEF(TOK_builtin_va_arg_types, "__builtin_va_arg_types")
|
|
#endif
|
|
#endif
|
|
DEF(TOK_REGPARM1, "regparm")
|
|
DEF(TOK_REGPARM2, "__regparm__")
|
|
|
|
#ifdef TCC_TARGET_ARM64
|
|
DEF(TOK___va_start, "__va_start")
|
|
DEF(TOK___va_arg, "__va_arg")
|
|
#endif
|
|
|
|
/* pragma */
|
|
DEF(TOK_pack, "pack")
|
|
#if !defined(TCC_TARGET_I386) && !defined(TCC_TARGET_X86_64)
|
|
/* already defined for assembler */
|
|
DEF(TOK_ASM_push, "push")
|
|
DEF(TOK_ASM_pop, "pop")
|
|
#endif
|
|
DEF(TOK_comment, "comment")
|
|
DEF(TOK_lib, "lib")
|
|
DEF(TOK_push_macro, "push_macro")
|
|
DEF(TOK_pop_macro, "pop_macro")
|
|
DEF(TOK_once, "once")
|
|
|
|
/* builtin functions or variables */
|
|
#ifndef TCC_ARM_EABI
|
|
DEF(TOK_memcpy, "memcpy")
|
|
DEF(TOK_memmove, "memmove")
|
|
DEF(TOK_memset, "memset")
|
|
DEF(TOK___divdi3, "__divdi3")
|
|
DEF(TOK___moddi3, "__moddi3")
|
|
DEF(TOK___udivdi3, "__udivdi3")
|
|
DEF(TOK___umoddi3, "__umoddi3")
|
|
DEF(TOK___ashrdi3, "__ashrdi3")
|
|
DEF(TOK___lshrdi3, "__lshrdi3")
|
|
DEF(TOK___ashldi3, "__ashldi3")
|
|
DEF(TOK___floatundisf, "__floatundisf")
|
|
DEF(TOK___floatundidf, "__floatundidf")
|
|
# ifndef TCC_ARM_VFP
|
|
DEF(TOK___floatundixf, "__floatundixf")
|
|
DEF(TOK___fixunsxfdi, "__fixunsxfdi")
|
|
# endif
|
|
DEF(TOK___fixunssfdi, "__fixunssfdi")
|
|
DEF(TOK___fixunsdfdi, "__fixunsdfdi")
|
|
#endif
|
|
|
|
#if defined TCC_TARGET_ARM
|
|
# ifdef TCC_ARM_EABI
|
|
DEF(TOK_memcpy, "__aeabi_memcpy")
|
|
DEF(TOK_memcpy4, "__aeabi_memcpy4")
|
|
DEF(TOK_memcpy8, "__aeabi_memcpy8")
|
|
DEF(TOK_memmove, "__aeabi_memmove")
|
|
DEF(TOK_memset, "__aeabi_memset")
|
|
DEF(TOK___aeabi_ldivmod, "__aeabi_ldivmod")
|
|
DEF(TOK___aeabi_uldivmod, "__aeabi_uldivmod")
|
|
DEF(TOK___aeabi_idivmod, "__aeabi_idivmod")
|
|
DEF(TOK___aeabi_uidivmod, "__aeabi_uidivmod")
|
|
DEF(TOK___divsi3, "__aeabi_idiv")
|
|
DEF(TOK___udivsi3, "__aeabi_uidiv")
|
|
DEF(TOK___floatdisf, "__aeabi_l2f")
|
|
DEF(TOK___floatdidf, "__aeabi_l2d")
|
|
DEF(TOK___fixsfdi, "__aeabi_f2lz")
|
|
DEF(TOK___fixdfdi, "__aeabi_d2lz")
|
|
DEF(TOK___ashrdi3, "__aeabi_lasr")
|
|
DEF(TOK___lshrdi3, "__aeabi_llsr")
|
|
DEF(TOK___ashldi3, "__aeabi_llsl")
|
|
DEF(TOK___floatundisf, "__aeabi_ul2f")
|
|
DEF(TOK___floatundidf, "__aeabi_ul2d")
|
|
DEF(TOK___fixunssfdi, "__aeabi_f2ulz")
|
|
DEF(TOK___fixunsdfdi, "__aeabi_d2ulz")
|
|
# else
|
|
DEF(TOK___modsi3, "__modsi3")
|
|
DEF(TOK___umodsi3, "__umodsi3")
|
|
DEF(TOK___divsi3, "__divsi3")
|
|
DEF(TOK___udivsi3, "__udivsi3")
|
|
DEF(TOK___floatdisf, "__floatdisf")
|
|
DEF(TOK___floatdidf, "__floatdidf")
|
|
# ifndef TCC_ARM_VFP
|
|
DEF(TOK___floatdixf, "__floatdixf")
|
|
DEF(TOK___fixunssfsi, "__fixunssfsi")
|
|
DEF(TOK___fixunsdfsi, "__fixunsdfsi")
|
|
DEF(TOK___fixunsxfsi, "__fixunsxfsi")
|
|
DEF(TOK___fixxfdi, "__fixxfdi")
|
|
# endif
|
|
DEF(TOK___fixsfdi, "__fixsfdi")
|
|
DEF(TOK___fixdfdi, "__fixdfdi")
|
|
# endif
|
|
#endif
|
|
|
|
#if defined TCC_TARGET_C67
|
|
DEF(TOK__divi, "_divi")
|
|
DEF(TOK__divu, "_divu")
|
|
DEF(TOK__divf, "_divf")
|
|
DEF(TOK__divd, "_divd")
|
|
DEF(TOK__remi, "_remi")
|
|
DEF(TOK__remu, "_remu")
|
|
#endif
|
|
|
|
#if defined TCC_TARGET_I386
|
|
DEF(TOK___fixsfdi, "__fixsfdi")
|
|
DEF(TOK___fixdfdi, "__fixdfdi")
|
|
DEF(TOK___fixxfdi, "__fixxfdi")
|
|
#endif
|
|
|
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
|
DEF(TOK_alloca, "alloca")
|
|
#endif
|
|
|
|
#if defined TCC_TARGET_PE
|
|
DEF(TOK___chkstk, "__chkstk")
|
|
#endif
|
|
#ifdef TCC_TARGET_ARM64
|
|
DEF(TOK___arm64_clear_cache, "__arm64_clear_cache")
|
|
DEF(TOK___addtf3, "__addtf3")
|
|
DEF(TOK___subtf3, "__subtf3")
|
|
DEF(TOK___multf3, "__multf3")
|
|
DEF(TOK___divtf3, "__divtf3")
|
|
DEF(TOK___extendsftf2, "__extendsftf2")
|
|
DEF(TOK___extenddftf2, "__extenddftf2")
|
|
DEF(TOK___trunctfsf2, "__trunctfsf2")
|
|
DEF(TOK___trunctfdf2, "__trunctfdf2")
|
|
DEF(TOK___fixtfsi, "__fixtfsi")
|
|
DEF(TOK___fixtfdi, "__fixtfdi")
|
|
DEF(TOK___fixunstfsi, "__fixunstfsi")
|
|
DEF(TOK___fixunstfdi, "__fixunstfdi")
|
|
DEF(TOK___floatsitf, "__floatsitf")
|
|
DEF(TOK___floatditf, "__floatditf")
|
|
DEF(TOK___floatunsitf, "__floatunsitf")
|
|
DEF(TOK___floatunditf, "__floatunditf")
|
|
DEF(TOK___eqtf2, "__eqtf2")
|
|
DEF(TOK___netf2, "__netf2")
|
|
DEF(TOK___lttf2, "__lttf2")
|
|
DEF(TOK___letf2, "__letf2")
|
|
DEF(TOK___gttf2, "__gttf2")
|
|
DEF(TOK___getf2, "__getf2")
|
|
#endif
|
|
|
|
/* bound checking symbols */
|
|
#ifdef CONFIG_TCC_BCHECK
|
|
DEF(TOK___bound_ptr_add, "__bound_ptr_add")
|
|
DEF(TOK___bound_ptr_indir1, "__bound_ptr_indir1")
|
|
DEF(TOK___bound_ptr_indir2, "__bound_ptr_indir2")
|
|
DEF(TOK___bound_ptr_indir4, "__bound_ptr_indir4")
|
|
DEF(TOK___bound_ptr_indir8, "__bound_ptr_indir8")
|
|
DEF(TOK___bound_ptr_indir12, "__bound_ptr_indir12")
|
|
DEF(TOK___bound_ptr_indir16, "__bound_ptr_indir16")
|
|
DEF(TOK___bound_main_arg, "__bound_main_arg")
|
|
DEF(TOK___bound_local_new, "__bound_local_new")
|
|
DEF(TOK___bound_local_delete, "__bound_local_delete")
|
|
# ifdef TCC_TARGET_PE
|
|
DEF(TOK_malloc, "malloc")
|
|
DEF(TOK_free, "free")
|
|
DEF(TOK_realloc, "realloc")
|
|
DEF(TOK_memalign, "memalign")
|
|
DEF(TOK_calloc, "calloc")
|
|
# endif
|
|
DEF(TOK_strlen, "strlen")
|
|
DEF(TOK_strcpy, "strcpy")
|
|
#endif
|
|
|
|
/* Tiny Assembler */
|
|
DEF_ASMDIR(byte) /* must be first directive */
|
|
DEF_ASMDIR(word)
|
|
DEF_ASMDIR(align)
|
|
DEF_ASMDIR(balign)
|
|
DEF_ASMDIR(p2align)
|
|
DEF_ASMDIR(set)
|
|
DEF_ASMDIR(skip)
|
|
DEF_ASMDIR(space)
|
|
DEF_ASMDIR(string)
|
|
DEF_ASMDIR(asciz)
|
|
DEF_ASMDIR(ascii)
|
|
DEF_ASMDIR(file)
|
|
DEF_ASMDIR(globl)
|
|
DEF_ASMDIR(global)
|
|
DEF_ASMDIR(weak)
|
|
DEF_ASMDIR(hidden)
|
|
DEF_ASMDIR(ident)
|
|
DEF_ASMDIR(size)
|
|
DEF_ASMDIR(type)
|
|
DEF_ASMDIR(text)
|
|
DEF_ASMDIR(data)
|
|
DEF_ASMDIR(bss)
|
|
DEF_ASMDIR(previous)
|
|
DEF_ASMDIR(pushsection)
|
|
DEF_ASMDIR(popsection)
|
|
DEF_ASMDIR(fill)
|
|
DEF_ASMDIR(rept)
|
|
DEF_ASMDIR(endr)
|
|
DEF_ASMDIR(org)
|
|
DEF_ASMDIR(quad)
|
|
#if defined(TCC_TARGET_I386)
|
|
DEF_ASMDIR(code16)
|
|
DEF_ASMDIR(code32)
|
|
#elif defined(TCC_TARGET_X86_64)
|
|
DEF_ASMDIR(code64)
|
|
#endif
|
|
DEF_ASMDIR(short)
|
|
DEF_ASMDIR(long)
|
|
DEF_ASMDIR(int)
|
|
DEF_ASMDIR(section) /* must be last directive */
|
|
|
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
|
#include "i386-tok.h"
|
|
#endif
|