tcctok.h 定义了 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")
- ..............................
- ..............................
- ..............................
同时定义了条件编译的相关内容
- /*****/
- /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")
在 i386-tok.h 中定义了汇编的相关关键词
- /------------------------------------------------------------------/
- /WARNING: relative order of tokens is important./
- /register/
- ?DEF_ASM(al)
- ?DEF_ASM(cl)
- ?DEF_ASM(dl)
- ?DEF_ASM(bl)
- ?DEF_ASM(ah)
- ?DEF_ASM(ch)
- ?DEF_ASM(dh)
- ?DEF_ASM(bh)
- ?DEF_ASM(ax)
- ?DEF_ASM(cx)
- ?DEF_ASM(dx)
- ?DEF_ASM(bx)
- ?DEF_ASM(sp)
- ?DEF_ASM(bp)
- ?DEF_ASM(si)
- ?DEF_ASM(di)
- ?DEF_ASM(eax)
- ?DEF_ASM(ecx)
- ?DEF_ASM(edx)
- ?DEF_ASM(ebx)
- ?DEF_ASM(esp)
- ?DEF_ASM(ebp)
- ?DEF_ASM(esi)
- ?DEF_ASM(edi)
- #ifdef TCC_TARGET_X86_64
- ?DEF_ASM(rax)
- ?DEF_ASM(rcx)
- ?DEF_ASM(rdx)
- ...........................
- ............................
在 x86_64-asm.h 中定义了 64 位汇编相关关键字
- ? ? ?DEF_ASM_OP0(clc, 0xf8) /must be first OP0/
- ? ? ?DEF_ASM_OP0(cld, 0xfc)
- ? ? ?DEF_ASM_OP0(cli, 0xfa)
- ? ? ?DEF_ASM_OP0(clts, 0x0f06)
- ? ? ?DEF_ASM_OP0(cmc, 0xf5)
- ? ? ?DEF_ASM_OP0(lahf, 0x9f)
- ? ? ?DEF_ASM_OP0(sahf, 0x9e)
- ? ? ?DEF_ASM_OP0(pushfl, 0x9c)
- ? ? ?DEF_ASM_OP0(popfl, 0x9d)
- ? ? ?DEF_ASM_OP0(pushf, 0x9c)
- ? ? ?DEF_ASM_OP0(popf, 0x9d)
- ? ? ?DEF_ASM_OP0(stc, 0xf9)
- ? ? ?DEF_ASM_OP0(std, 0xfd)
- ? ? ?DEF_ASM_OP0(sti, 0xfb)
- ? ? ?DEF_ASM_OP0(aaa, 0x37)
先从几个重要文件入手.
- libtcc.c
- /? ?TCC - Tiny C Compiler
- ??
- ? ?Copyright (c) 2001-2004 Fabrice Bellard
- ?? This library is free software; you can redistribute it and/or
- ?modify it under the terms of the GNU Lesser General Public
- ? License as published by the Free Software Foundation; either
- ?version 2 of the License, or (at your option) any later version.
- ?
- ?This library is distributed in the hope that it will be useful,
- ? but WITHOUT ANY WARRANTY; without even the implied warranty of
- ?MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the GNU
? Lesser General Public License for more details.
- ?? You should have received a copy of the GNU Lesser General Public
- ?License along with this library; if not, write to the Free Software
- ? Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ?02111-1307 ?USA
- ?*/
- #include "tcc.h"
- /****/
- /global variables/
使用 GCC 扩展还是 TCC 扩展
- /use GNU C extensions/
- ST_DATA int gnu_ext = 1;
- /use TinyCC extensions/
- ST_DATA int tcc_ext = 1;
ST_DATA 结构标注 TCC 状态.
- /XXX: get rid of this ASAP/
- ST_DATA struct TCCState *tcc_state;
- /****/
根据标志包含一些相应 TCC 文件.
- #ifdef ONE_SOURCE
- #include "tccpp.c"
- #include "tccgen.c"
- #include "tccelf.c"
- #include "tccrun.c"
- #ifdef TCC_TARGET_I386
- #include "i386-gen.c"
- #endif
- #ifdef TCC_TARGET_ARM
- #include "arm-gen.c"
- #endif
- #ifdef TCC_TARGET_C67
- #include "c67-gen.c"
- #endif
- #ifdef TCC_TARGET_X86_64
- #include "x86_64-gen.c"
- #endif
- #ifdef CONFIG_TCC_ASM
- #include "tccasm.c"
- #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
- #include "i386-asm.c"
- #endif
- #endif
- #ifdef TCC_TARGET_COFF
- #include "tcccoff.c"
- #endif
- #ifdef TCC_TARGET_PE
- #include "tccpe.c"
- #endif
- #endif /ONE_SOURCE/
CONFIG_TCC_ASM 打开内联汇编的开关
- /****/
- #ifndef CONFIG_TCC_ASM
- ST_FUNC void asm_instr(void)
- {
- ? ? tcc_error("inline asm() not supported");
- }
- ST_FUNC void asm_global_instr(void)
- {
- ? ? tcc_error("inline asm() not supported");
- }
- #endif
来源: http://www.bubuko.com/infodetail-2867823.html