Changeset 331 for EcnlProtoTool/trunk/tcc-0.9.27/tcc.h
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/tcc-0.9.27
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/tcc-0.9.27/tcc.h
r321 r331 1 1 /* 2 2 * TCC - Tiny C Compiler 3 * 3 * 4 4 * Copyright (c) 2001-2004 Fabrice Bellard 5 5 * … … 25 25 #include "config.h" 26 26 27 #ifdef CONFIG_TCCBOOT28 #include "tccboot.h"29 #define CONFIG_TCC_STATIC30 #else31 32 27 #include <stdlib.h> 33 28 #include <stdio.h> … … 36 31 #include <errno.h> 37 32 #include <math.h> 38 #include <signal.h>39 #define SA_RESETHAND 0x8000000040 #define FPE_INTDIV 141 #define FPE_FLTDIV 342 typedef struct { int si_signo, si_errno, si_code; } siginfo_t;43 33 #include <fcntl.h> 44 34 #include <setjmp.h> … … 48 38 # include <unistd.h> 49 39 # include <sys/time.h> 50 /*# include <sys/ucontext.h>*/51 typedef struct __ucontext ucontext_t;52 /*# include <sys/mman.h>*/53 #define PROT_READ 154 #define PROT_WRITE 255 #define PROT_EXEC 456 40 # ifndef CONFIG_TCC_STATIC 57 41 # include <dlfcn.h> 58 42 # endif 59 #else 60 # include <unistd.h> 61 # include <sys/time.h> 62 # include <sys/ucontext.h> 63 # include <sys/mman.h> 43 /* XXX: need to define this to use them in non ISOC99 context */ 44 extern float strtof (const char *__nptr, char **__endptr); 45 extern long double strtold (const char *__nptr, char **__endptr); 46 #endif 47 48 #ifdef _WIN32 49 # include <windows.h> 50 # include <io.h> /* open, close etc. */ 51 # include <direct.h> /* getcwd */ 52 # ifdef __GNUC__ 64 53 # include <stdint.h> 54 # endif 65 55 # define inline __inline 66 # define inp next_inp 56 # define snprintf _snprintf 57 # define vsnprintf _vsnprintf 58 # ifndef __GNUC__ 59 # define strtold (long double)strtod 60 # define strtof (float)strtod 61 # define strtoll _strtoi64 62 # define strtoull _strtoui64 63 # endif 67 64 # ifdef LIBTCC_AS_DLL 68 65 # define LIBTCCAPI __declspec(dllexport) 69 66 # define PUB_FUNC LIBTCCAPI 70 67 # endif 71 #endif 72 73 #endif /* !CONFIG_TCCBOOT */ 68 # define inp next_inp /* inp is an intrinsic on msvc/mingw */ 69 # ifdef _MSC_VER 70 # pragma warning (disable : 4244) // conversion from 'uint64_t' to 'int', possible loss of data 71 # pragma warning (disable : 4267) // conversion from 'size_t' to 'int', possible loss of data 72 # pragma warning (disable : 4996) // The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name 73 # pragma warning (disable : 4018) // signed/unsigned mismatch 74 # pragma warning (disable : 4146) // unary minus operator applied to unsigned type, result still unsigned 75 # define ssize_t intptr_t 76 # endif 77 # undef CONFIG_TCC_STATIC 78 #endif 74 79 75 80 #ifndef O_BINARY … … 77 82 #endif 78 83 79 #include "elf.h" 80 #ifdef TCC_TARGET_X86_64 81 # define ELFCLASSW ELFCLASS64 82 # define ElfW(type) Elf##64##_##type 83 # define ELFW(type) ELF##64##_##type 84 # define ElfW_Rel ElfW(Rela) 85 # define SHT_RELX SHT_RELA 86 # define REL_SECTION_FMT ".rela%s" 87 /* XXX: DLL with PLT would only work with x86-64 for now */ 88 # define TCC_OUTPUT_DLL_WITH_PLT 84 #ifndef offsetof 85 #define offsetof(type, field) ((size_t) &((type *)0)->field) 86 #endif 87 88 #ifndef countof 89 #define countof(tab) (sizeof(tab) / sizeof((tab)[0])) 90 #endif 91 92 #ifdef _MSC_VER 93 # define NORETURN __declspec(noreturn) 94 # define ALIGNED(x) __declspec(align(x)) 89 95 #else 90 # define ELFCLASSW ELFCLASS32 91 # define ElfW(type) Elf##32##_##type 92 # define ELFW(type) ELF##32##_##type 93 # define ElfW_Rel ElfW(Rel) 94 # define SHT_RELX SHT_REL 95 # define REL_SECTION_FMT ".rel%s" 96 #endif 97 98 /* target address type */ 99 #define addr_t ElfW(Addr) 100 101 #include "stab.h" 102 #include "libtcc.h" 96 # define NORETURN __attribute__((noreturn)) 97 # define ALIGNED(x) __attribute__((aligned(x))) 98 #endif 99 100 #ifdef _WIN32 101 # define IS_DIRSEP(c) (c == '/' || c == '\\') 102 # define IS_ABSPATH(p) (IS_DIRSEP(p[0]) || (p[0] && p[1] == ':' && IS_DIRSEP(p[2]))) 103 # define PATHCMP stricmp 104 # define PATHSEP ";" 105 #else 106 # define IS_DIRSEP(c) (c == '/') 107 # define IS_ABSPATH(p) IS_DIRSEP(p[0]) 108 # define PATHCMP strcmp 109 # define PATHSEP ":" 110 #endif 111 112 /* -------------------------------------------- */ 103 113 104 114 /* parser debug */ 105 / /#define PARSE_DEBUG115 /* #define PARSE_DEBUG */ 106 116 /* preprocessor debug */ 107 / /#define PP_DEBUG117 /* #define PP_DEBUG */ 108 118 /* include file debug */ 109 / /#define INC_DEBUG119 /* #define INC_DEBUG */ 110 120 /* memory leak debug */ 111 / /#define MEM_DEBUG121 /* #define MEM_DEBUG */ 112 122 /* assembler debug */ 113 / /#define ASM_DEBUG123 /* #define ASM_DEBUG */ 114 124 115 125 /* target selection */ 116 / /#define TCC_TARGET_I386/* i386 code generator */117 / /#define TCC_TARGET_ARM /* ARMv4 code generator */118 / /#define TCC_TARGET_C67 /* TMS320C67xxcode generator */119 / /#define TCC_TARGET_X86_64 /* x86-64code generator */120 / /#define TCC_TARGET_IL /* ILcode generator */126 /* #define TCC_TARGET_I386 *//* i386 code generator */ 127 /* #define TCC_TARGET_X86_64 *//* x86-64 code generator */ 128 /* #define TCC_TARGET_ARM *//* ARMv4 code generator */ 129 /* #define TCC_TARGET_ARM64 *//* ARMv8 code generator */ 130 /* #define TCC_TARGET_C67 *//* TMS320C67xx code generator */ 121 131 122 132 /* default target is I386 */ 123 133 #if !defined(TCC_TARGET_I386) && !defined(TCC_TARGET_ARM) && \ 124 !defined(TCC_TARGET_C67) && !defined(TCC_TARGET_X86_64) && \ 125 !defined(TCC_TARGET_IL) 126 #define TCC_TARGET_I386 127 #endif 128 129 #if !defined(TCC_UCLIBC) && !defined(TCC_TARGET_ARM) && \ 130 !defined(TCC_TARGET_C67) && !defined(TCC_TARGET_X86_64) 131 #define CONFIG_TCC_BCHECK /* enable bound checking code */ 132 #endif 133 134 /* define it to include assembler support */ 135 #if !defined(TCC_TARGET_ARM) && !defined(TCC_TARGET_C67) 136 #define CONFIG_TCC_ASM 137 #endif 138 139 /* object format selection */ 140 #if defined(TCC_TARGET_C67) 141 #define TCC_TARGET_COFF 134 !defined(TCC_TARGET_ARM64) && !defined(TCC_TARGET_C67) && \ 135 !defined(TCC_TARGET_X86_64) 136 # if defined __x86_64__ || defined _AMD64_ 137 # define TCC_TARGET_X86_64 138 # elif defined __arm__ 139 # define TCC_TARGET_ARM 140 # define TCC_ARM_EABI 141 # define TCC_ARM_HARDFLOAT 142 # elif defined __aarch64__ 143 # define TCC_TARGET_ARM64 144 # else 145 # define TCC_TARGET_I386 146 # endif 147 # ifdef _WIN32 148 # define TCC_TARGET_PE 1 149 # endif 142 150 #endif 143 151 … … 150 158 # elif defined __arm__ && defined TCC_TARGET_ARM 151 159 # define TCC_IS_NATIVE 160 # elif defined __aarch64__ && defined TCC_TARGET_ARM64 161 # define TCC_IS_NATIVE 152 162 # endif 153 163 #endif … … 155 165 #if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT 156 166 # define CONFIG_TCC_BACKTRACE 167 # if (defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64) \ 168 && !defined TCC_UCLIBC && !defined TCC_MUSL 169 # define CONFIG_TCC_BCHECK /* enable bound checking code */ 170 # endif 157 171 #endif 158 172 … … 163 177 #endif 164 178 #ifndef CONFIG_TCCDIR 165 # define CONFIG_TCCDIR " ."179 # define CONFIG_TCCDIR "/usr/local/lib/tcc" 166 180 #endif 167 181 #ifndef CONFIG_LDDIR 168 182 # define CONFIG_LDDIR "lib" 169 183 #endif 184 #ifdef CONFIG_TRIPLET 185 # define USE_TRIPLET(s) s "/" CONFIG_TRIPLET 186 # define ALSO_TRIPLET(s) USE_TRIPLET(s) ":" s 187 #else 188 # define USE_TRIPLET(s) s 189 # define ALSO_TRIPLET(s) s 190 #endif 170 191 171 192 /* path to find crt1.o, crti.o and crtn.o */ 172 193 #ifndef CONFIG_TCC_CRTPREFIX 173 # define CONFIG_TCC_CRTPREFIX CONFIG_SYSROOT "/usr/" CONFIG_LDDIR194 # define CONFIG_TCC_CRTPREFIX USE_TRIPLET(CONFIG_SYSROOT "/usr/" CONFIG_LDDIR) 174 195 #endif 175 196 … … 179 200 #ifndef CONFIG_TCC_SYSINCLUDEPATHS 180 201 # ifdef TCC_TARGET_PE 181 # define CONFIG_TCC_SYSINCLUDEPATHS "{B}/include;{B}/include/winapi" 182 # elif defined CONFIG_MULTIARCHDIR 183 # define CONFIG_TCC_SYSINCLUDEPATHS \ 184 CONFIG_SYSROOT "/usr/local/include" \ 185 ":" CONFIG_SYSROOT "/usr/local/include/" CONFIG_MULTIARCHDIR \ 186 ":" CONFIG_SYSROOT "/usr/include" \ 187 ":" CONFIG_SYSROOT "/usr/include/" CONFIG_MULTIARCHDIR \ 188 ":" "{B}/include" 202 # define CONFIG_TCC_SYSINCLUDEPATHS "{B}/include"PATHSEP"{B}/include/winapi" 189 203 # else 190 204 # define CONFIG_TCC_SYSINCLUDEPATHS \ 191 CONFIG_SYSROOT "/usr/local/include" \192 ":" CONFIG_SYSROOT "/usr/include"\193 ":" "{B}/include"205 "{B}/include" \ 206 ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/local/include") \ 207 ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/include") 194 208 # endif 195 209 #endif … … 201 215 # else 202 216 # define CONFIG_TCC_LIBPATHS \ 203 CONFIG_SYSROOT "/usr/" CONFIG_LDDIR\204 ":" CONFIG_SYSROOT "/" CONFIG_LDDIR\205 ":" CONFIG_SYSROOT "/usr/local/" CONFIG_LDDIR217 ALSO_TRIPLET(CONFIG_SYSROOT "/usr/" CONFIG_LDDIR) \ 218 ":" ALSO_TRIPLET(CONFIG_SYSROOT "/" CONFIG_LDDIR) \ 219 ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/local/" CONFIG_LDDIR) 206 220 # endif 207 221 #endif … … 212 226 # define CONFIG_TCC_ELFINTERP "/libexec/ld-elf.so.1" 213 227 # elif defined __FreeBSD_kernel__ 214 # define CONFIG_TCC_ELFINTERP "/lib/ld.so.1" 215 # elif defined TCC_ARM_HARDFLOAT 216 # define CONFIG_TCC_ELFINTERP "/lib/ld-linux-armhf.so.3" 217 # elif defined TCC_ARM_EABI 218 # define CONFIG_TCC_ELFINTERP "/lib/ld-linux.so.3" 219 # elif defined(TCC_TARGET_X86_64) 220 # define CONFIG_TCC_ELFINTERP "/lib64/ld-linux-x86-64.so.2" 221 # elif defined(TCC_UCLIBC) 222 # define CONFIG_TCC_ELFINTERP "/lib/ld-uClibc.so.0" 228 # if defined(TCC_TARGET_X86_64) 229 # define CONFIG_TCC_ELFINTERP "/lib/ld-kfreebsd-x86-64.so.1" 230 # else 231 # define CONFIG_TCC_ELFINTERP "/lib/ld.so.1" 232 # endif 233 # elif defined __DragonFly__ 234 # define CONFIG_TCC_ELFINTERP "/usr/libexec/ld-elf.so.2" 235 # elif defined __NetBSD__ 236 # define CONFIG_TCC_ELFINTERP "/usr/libexec/ld.elf_so" 237 # elif defined __GNU__ 238 # define CONFIG_TCC_ELFINTERP "/lib/ld.so" 223 239 # elif defined(TCC_TARGET_PE) 224 240 # define CONFIG_TCC_ELFINTERP "-" 225 # else 226 # define CONFIG_TCC_ELFINTERP "/lib/ld-linux.so.2" 241 # elif defined(TCC_UCLIBC) 242 # define CONFIG_TCC_ELFINTERP "/lib/ld-uClibc.so.0" /* is there a uClibc for x86_64 ? */ 243 # elif defined TCC_TARGET_ARM64 244 # if defined(TCC_MUSL) 245 # define CONFIG_TCC_ELFINTERP "/lib/ld-musl-aarch64.so.1" 246 # else 247 # define CONFIG_TCC_ELFINTERP "/lib/ld-linux-aarch64.so.1" 248 # endif 249 # elif defined(TCC_TARGET_X86_64) 250 # if defined(TCC_MUSL) 251 # define CONFIG_TCC_ELFINTERP "/lib/ld-musl-x86_64.so.1" 252 # else 253 # define CONFIG_TCC_ELFINTERP "/lib64/ld-linux-x86-64.so.2" 254 # endif 255 # elif !defined(TCC_ARM_EABI) 256 # if defined(TCC_MUSL) 257 # define CONFIG_TCC_ELFINTERP "/lib/ld-musl-arm.so.1" 258 # else 259 # define CONFIG_TCC_ELFINTERP "/lib/ld-linux.so.2" 260 # endif 227 261 # endif 228 262 #endif 229 263 264 /* var elf_interp dans *-gen.c */ 265 #ifdef CONFIG_TCC_ELFINTERP 266 # define DEFAULT_ELFINTERP(s) CONFIG_TCC_ELFINTERP 267 #else 268 # define DEFAULT_ELFINTERP(s) default_elfinterp(s) 269 #endif 270 271 /* (target specific) libtcc1.a */ 272 #ifndef TCC_LIBTCC1 273 # define TCC_LIBTCC1 "libtcc1.a" 274 #endif 275 230 276 /* library to use with CONFIG_USE_LIBGCC instead of libtcc1.a */ 231 #define TCC_LIBGCC CONFIG_SYSROOT "/" CONFIG_LDDIR "/libgcc_s.so.1" 277 #if defined CONFIG_USE_LIBGCC && !defined TCC_LIBGCC 278 #define TCC_LIBGCC USE_TRIPLET(CONFIG_SYSROOT "/" CONFIG_LDDIR) "/libgcc_s.so.1" 279 #endif 280 281 /* -------------------------------------------- */ 282 283 #include "libtcc.h" 284 #include "elf.h" 285 #include "stab.h" 286 287 /* -------------------------------------------- */ 288 289 #ifndef PUB_FUNC /* functions used by tcc.c but not in libtcc.h */ 290 # define PUB_FUNC 291 #endif 292 293 #ifndef ONE_SOURCE 294 # define ONE_SOURCE 1 295 #endif 296 297 #if ONE_SOURCE 298 #define ST_INLN static inline 299 #define ST_FUNC static 300 #define ST_DATA static 301 #else 302 #define ST_INLN 303 #define ST_FUNC 304 #define ST_DATA extern 305 #endif 306 307 #ifdef TCC_PROFILE /* profile all functions */ 308 # define static 309 #endif 232 310 233 311 /* -------------------------------------------- */ … … 237 315 #ifdef TCC_TARGET_I386 238 316 # include "i386-gen.c" 317 # include "i386-link.c" 239 318 #endif 240 319 #ifdef TCC_TARGET_X86_64 241 320 # include "x86_64-gen.c" 321 # include "x86_64-link.c" 242 322 #endif 243 323 #ifdef TCC_TARGET_ARM 244 324 # include "arm-gen.c" 325 # include "arm-link.c" 326 # include "arm-asm.c" 327 #endif 328 #ifdef TCC_TARGET_ARM64 329 # include "arm64-gen.c" 330 # include "arm64-link.c" 245 331 #endif 246 332 #ifdef TCC_TARGET_C67 333 # define TCC_TARGET_COFF 247 334 # include "coff.h" 248 335 # include "c67-gen.c" 249 #endif 250 #ifdef TCC_TARGET_IL 251 #include "il-gen.c" 336 # include "c67-link.c" 252 337 #endif 253 338 #undef TARGET_DEFS_ONLY 339 340 /* -------------------------------------------- */ 341 342 #if PTR_SIZE == 8 343 # define ELFCLASSW ELFCLASS64 344 # define ElfW(type) Elf##64##_##type 345 # define ELFW(type) ELF##64##_##type 346 # define ElfW_Rel ElfW(Rela) 347 # define SHT_RELX SHT_RELA 348 # define REL_SECTION_FMT ".rela%s" 349 #else 350 # define ELFCLASSW ELFCLASS32 351 # define ElfW(type) Elf##32##_##type 352 # define ELFW(type) ELF##32##_##type 353 # define ElfW_Rel ElfW(Rel) 354 # define SHT_RELX SHT_REL 355 # define REL_SECTION_FMT ".rel%s" 356 #endif 357 /* target address type */ 358 #define addr_t ElfW(Addr) 359 #define ElfSym ElfW(Sym) 360 361 #if PTR_SIZE == 8 && !defined TCC_TARGET_PE 362 # define LONG_SIZE 8 363 #else 364 # define LONG_SIZE 4 365 #endif 254 366 255 367 /* -------------------------------------------- */ … … 259 371 #define VSTACK_SIZE 256 260 372 #define STRING_MAX_SIZE 1024 373 #define TOKSTR_MAX_SIZE 256 261 374 #define PACK_STACK_SIZE 8 262 375 263 #define TOK_HASH_SIZE 8192/* must be a power of two */376 #define TOK_HASH_SIZE 16384 /* must be a power of two */ 264 377 #define TOK_ALLOC_INCR 512 /* must be a power of two */ 265 378 #define TOK_MAX_SIZE 4 /* token max size in int unit when stored in string */ … … 287 400 void *data; /* either 'char *' or 'nwchar_t *' */ 288 401 int size_allocated; 289 void *data_allocated; /* if non NULL, data has been malloced */290 402 } CString; 291 403 … … 301 413 double d; 302 414 float f; 303 int i; 304 unsigned int ui; 305 unsigned int ul; /* address (should be unsigned long on 64 bit cpu) */ 306 long long ll; 307 unsigned long long ull; 308 struct CString *cstr; 309 void *ptr; 415 uint64_t i; 416 struct { 417 int size; 418 const void *data; 419 } str; 310 420 int tab[LDOUBLE_SIZE/4]; 311 421 } CValue; … … 318 428 type. If not used, set to VT_CONST */ 319 429 CValue c; /* constant, if VT_CONST */ 320 struct Sym *sym; /* symbol, if (VT_SYM | VT_CONST) */ 430 struct Sym *sym; /* symbol, if (VT_SYM | VT_CONST), or if 431 result of unary() for an identifier. */ 321 432 } SValue; 433 434 /* symbol attributes */ 435 struct SymAttr { 436 unsigned short 437 aligned : 5, /* alignment as log2+1 (0 == unspecified) */ 438 packed : 1, 439 weak : 1, 440 visibility : 2, 441 dllexport : 1, 442 dllimport : 1, 443 unused : 5; 444 }; 445 446 /* function attributes or temporary attributes for parsing */ 447 struct FuncAttr { 448 unsigned 449 func_call : 3, /* calling convention (0..5), see below */ 450 func_type : 2, /* FUNC_OLD/NEW/ELLIPSIS */ 451 func_args : 8; /* PE __stdcall args */ 452 }; 453 454 /* GNUC attribute definition */ 455 typedef struct AttributeDef { 456 struct SymAttr a; 457 struct FuncAttr f; 458 struct Section *section; 459 int alias_target; /* token */ 460 int asm_label; /* associated asm label */ 461 char attr_mode; /* __attribute__((__mode__(...))) */ 462 } AttributeDef; 322 463 323 464 /* symbol management */ 324 465 typedef struct Sym { 325 int v; 326 char *asm_label; /* associated asm label*/327 long r; /* associated register*/466 int v; /* symbol token */ 467 unsigned short r; /* associated register or VT_CONST/VT_LOCAL and LVAL type */ 468 struct SymAttr a; /* symbol attributes */ 328 469 union { 329 long c; /* associated number */ 330 int *d; /* define token stream */ 470 struct { 471 int c; /* associated number or Elf symbol index */ 472 union { 473 int sym_scope; /* scope level for locals */ 474 int jnext; /* next jump label */ 475 struct FuncAttr f; /* function attributes */ 476 int auxtype; /* bitfield access type */ 477 }; 478 }; 479 long long enum_val; /* enum constant if IS_ENUM_VAL */ 480 int *d; /* define token stream */ 331 481 }; 332 CType type; 482 CType type; /* associated type */ 333 483 union { 334 struct Sym *next; /* next related symbol */335 long jnext; /* next jumplabel */484 struct Sym *next; /* next related symbol (for fields and anoms) */ 485 int asm_label; /* associated asm label */ 336 486 }; 337 487 struct Sym *prev; /* prev symbol in stack */ … … 340 490 341 491 /* section definition */ 342 /* XXX: use directly ELF structure for parameters ? */343 /* special flag to indicate that the section should not be linked to344 the other ones */345 #define SHF_PRIVATE 0x80000000346 347 /* special flag, too */348 #define SECTION_ABS ((void *)1)349 350 492 typedef struct Section { 351 493 unsigned long data_offset; /* current data offset */ … … 365 507 struct Section *link; /* link to another section */ 366 508 struct Section *reloc; /* corresponding section for relocation, if any */ 367 struct Section *hash; 368 struct Section * next;509 struct Section *hash; /* hash table for symbols */ 510 struct Section *prev; /* previous section on section stack */ 369 511 char name[1]; /* section name */ 370 512 } Section; … … 376 518 } DLLReference; 377 519 378 /* GNUC attribute definition */379 typedef struct AttributeDef {380 unsigned381 func_call : 3, /* calling convention (0..5), see below */382 aligned : 5, /* alignement (0..16) */383 packed : 1,384 func_export : 1,385 func_import : 1,386 func_args : 5,387 mode : 4,388 weak : 1,389 fill : 11;390 struct Section *section;391 int alias_target; /* token */392 } AttributeDef;393 394 /* gr: wrappers for casting sym->r for other purposes */395 #define FUNC_CALL(r) (((AttributeDef*)&(r))->func_call)396 #define FUNC_EXPORT(r) (((AttributeDef*)&(r))->func_export)397 #define FUNC_IMPORT(r) (((AttributeDef*)&(r))->func_import)398 #define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)399 #define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)400 #define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)401 #define ATTR_MODE(r) (((AttributeDef*)&(r))->mode)402 #define INT_ATTR(ad) (*(int*)(ad))403 404 520 /* -------------------------------------------------- */ 405 521 … … 408 524 #define SYM_FIRST_ANOM 0x10000000 /* first anonymous sym */ 409 525 410 /* stored in 'Sym .c' field */526 /* stored in 'Sym->f.func_type' field */ 411 527 #define FUNC_NEW 1 /* ansi function prototype */ 412 528 #define FUNC_OLD 2 /* old function prototype */ 413 529 #define FUNC_ELLIPSIS 3 /* ansi function prototype with ... */ 414 530 415 /* stored in 'Sym .r' field */531 /* stored in 'Sym->f.func_call' field */ 416 532 #define FUNC_CDECL 0 /* standard c call */ 417 533 #define FUNC_STDCALL 1 /* pascal c call */ … … 442 558 struct BufferedFile *prev; 443 559 int line_num; /* current line number - here to simplify code */ 560 int line_ref; /* tcc -E: last printed line */ 444 561 int ifndef_macro; /* #ifndef macro / #endif search */ 445 562 int ifndef_macro_saved; /* saved ifndef_macro */ 446 563 int *ifdef_stack_ptr; /* ifdef_stack value at the start of the file */ 564 int include_next_index; /* next search path */ 447 565 char filename[1024]; /* filename */ 448 unsigned char buffer[IO_BUF_SIZE + 1]; /* extra size for CH_EOB char */ 566 char *true_filename; /* filename not modified by # line directive */ 567 unsigned char unget[4]; 568 unsigned char buffer[1]; /* extra size for CH_EOB char */ 449 569 } BufferedFile; 450 570 451 571 #define CH_EOB '\\' /* end of buffer or '\0' char in file */ 452 572 #define CH_EOF (-1) /* end of file */ 453 454 /* parsing state (used to save parser state to reparse part of the455 source several times) */456 typedef struct ParseState {457 const int *macro_ptr;458 int line_num;459 int tok;460 CValue tokc;461 } ParseState;462 573 463 574 /* used to record tokens */ … … 465 576 int *str; 466 577 int len; 578 int lastlen; 467 579 int allocated_len; 468 580 int last_line_num; 581 int save_line_num; 582 /* used to chain token-strings with begin/end_macro() */ 583 struct TokenString *prev; 584 const int *prev_ptr; 585 char alloc; 469 586 } TokenString; 470 587 471 588 /* inline functions */ 472 589 typedef struct InlineFunc { 473 int *token_str;590 TokenString *func_str; 474 591 Sym *sym; 475 592 char filename[1]; … … 480 597 typedef struct CachedInclude { 481 598 int ifndef_macro; 599 int once; 482 600 int hash_next; /* -1 if none */ 483 601 char filename[1]; /* path specified in #include */ 484 602 } CachedInclude; 485 603 486 #define CACHED_INCLUDES_HASH_SIZE 512604 #define CACHED_INCLUDES_HASH_SIZE 32 487 605 488 606 #ifdef CONFIG_TCC_ASM 489 607 typedef struct ExprValue { 490 uint 32_t v;608 uint64_t v; 491 609 Sym *sym; 610 int pcrel; 492 611 } ExprValue; 493 612 494 613 #define MAX_ASM_OPERANDS 30 495 614 typedef struct ASMOperand { 496 int id; /* GCC 3 option nal identifier (0 if number only supported */615 int id; /* GCC 3 optional identifier (0 if number only supported */ 497 616 char *constraint; 498 617 char asm_str[16]; /* computed asm string for operand */ … … 508 627 #endif 509 628 629 /* extra symbol attributes (not in symbol table) */ 510 630 struct sym_attr { 511 unsigned long got_offset; 631 unsigned got_offset; 632 unsigned plt_offset; 633 int plt_sym; 634 int dyn_index; 512 635 #ifdef TCC_TARGET_ARM 513 636 unsigned char plt_thumb_stub:1; … … 529 652 char *soname; /* as specified on the command line (-soname) */ 530 653 char *rpath; /* as specified on the command line (-Wl,-rpath=) */ 654 int enable_new_dtags; /* ditto, (-Wl,--enable-new-dtags) */ 531 655 532 656 /* output type, see TCC_OUTPUT_XXX */ … … 538 662 int char_is_unsigned; 539 663 int leading_underscore; 540 664 int ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */ 665 int dollars_in_identifiers; /* allows '$' char in identifiers */ 666 int ms_bitfields; /* if true, emulate MS algorithm for aligning bitfields */ 667 541 668 /* warning switches */ 542 669 int warn_write_strings; … … 545 672 int warn_none; 546 673 int warn_implicit_function_declaration; 674 int warn_gcc_compat; 547 675 548 676 /* compile with debug symbol (and use them if error during execution) */ … … 552 680 int do_bounds_check; 553 681 #endif 682 #ifdef TCC_TARGET_ARM 683 enum float_abi float_abi; /* float ABI of the generated code*/ 684 #endif 685 int run_test; /* nth test to run with -dt -run */ 554 686 555 687 addr_t text_addr; /* address of text section */ 556 688 int has_text_addr; 557 689 558 unsigned longsection_align; /* section alignment */690 unsigned section_align; /* section alignment */ 559 691 560 692 char *init_symbol; /* symbols to call at load-time (not used currently) */ 561 693 char *fini_symbol; /* symbols to call at unload-time (not used currently) */ 562 694 563 695 #ifdef TCC_TARGET_I386 564 696 int seg_size; /* 32. Can be 16 with i386 assembler (.code16) */ 697 #endif 698 #ifdef TCC_TARGET_X86_64 699 int nosse; /* For -mno-sse support. */ 565 700 #endif 566 701 … … 583 718 char **crt_paths; 584 719 int nb_crt_paths; 720 721 /* -include files */ 722 char **cmd_include_files; 723 int nb_cmd_include_files; 585 724 586 725 /* error handling */ … … 593 732 /* output file for preprocessing (-E) */ 594 733 FILE *ppfp; 734 enum { 735 LINE_MACRO_OUTPUT_FORMAT_GCC, 736 LINE_MACRO_OUTPUT_FORMAT_NONE, 737 LINE_MACRO_OUTPUT_FORMAT_STD, 738 LINE_MACRO_OUTPUT_FORMAT_P10 = 11 739 } Pflag; /* -P switch */ 740 char dflag; /* -dX value */ 595 741 596 742 /* for -MD/-MF: collected dependencies for this compilation */ … … 613 759 int pack_stack[PACK_STACK_SIZE]; 614 760 int *pack_stack_ptr; 761 char **pragma_libs; 762 int nb_pragma_libs; 615 763 616 764 /* inline functions are stored as token lists and compiled last … … 629 777 Section *got; 630 778 Section *plt; 631 struct sym_attr *sym_attrs;632 int nb_sym_attrs;633 /* give the correspondance from symtab indexes to dynsym indexes */634 int *symtab_to_dynsym;635 779 636 780 /* temporary dynamic symbol sections (for dll loading) */ … … 638 782 /* exported dynamic symbol section */ 639 783 Section *dynsym; 640 /* copy of the g obal symtab_section variable */784 /* copy of the global symtab_section variable */ 641 785 Section *symtab; 642 /* tiny assembler state */ 643 Sym *asm_labels; 786 /* extra attributes (eg. GOT/PLT value) for symtab symbols */ 787 struct sym_attr *sym_attrs; 788 int nb_sym_attrs; 644 789 645 790 #ifdef TCC_TARGET_PE 646 791 /* PE info */ 647 792 int pe_subsystem; 793 unsigned pe_characteristics; 648 794 unsigned pe_file_align; 649 795 unsigned pe_stack_size; 796 addr_t pe_imagebase; 650 797 # ifdef TCC_TARGET_X86_64 651 798 Section *uw_pdata; … … 656 803 657 804 #ifdef TCC_IS_NATIVE 658 /* for tcc_relocate */ 659 void *runtime_mem; 660 # ifdef HAVE_SELINUX 661 void *write_mem; 662 unsigned long mem_size; 663 # endif 664 # if !defined TCC_TARGET_PE && (defined TCC_TARGET_X86_64 || defined TCC_TARGET_ARM) 665 /* write PLT and GOT here */ 666 char *runtime_plt_and_got; 667 unsigned runtime_plt_and_got_offset; 668 # define TCC_HAS_RUNTIME_PLTGOT 669 # endif 805 const char *runtime_main; 806 void **runtime_mem; 807 int nb_runtime_mem; 670 808 #endif 671 809 672 810 /* used by main and tcc_parse_args only */ 673 char**files; /* files seen on command line */811 struct filespec **files; /* files seen on command line */ 674 812 int nb_files; /* number thereof */ 675 813 int nb_libraries; /* number of libs thereof */ 814 int filetype; 676 815 char *outfile; /* output filename */ 677 char *option_m; /* only -m32/-m64 handled */678 int print_search_dirs; /* option */679 816 int option_r; /* option -r */ 680 817 int do_bench; /* option -bench */ 681 818 int gen_deps; /* option -MD */ 682 819 char *deps_outfile; /* option -MF */ 820 int option_pthread; /* -pthread option */ 821 int argc; 822 char **argv; 823 }; 824 825 struct filespec { 826 char type; 827 char alacarte; 828 char name[1]; 683 829 }; 684 830 … … 691 837 #define VT_JMP 0x0034 /* value is the consequence of jmp true (even) */ 692 838 #define VT_JMPI 0x0035 /* value is the consequence of jmp false (odd) */ 693 #define VT_REF 0x0040 /* value is pointer to structure rather than address */694 839 #define VT_LVAL 0x0100 /* var is an lvalue */ 695 840 #define VT_SYM 0x0200 /* a symbol value is added */ … … 707 852 /* types */ 708 853 #define VT_BTYPE 0x000f /* mask for basic type */ 709 #define VT_ INT 0 /* integertype */854 #define VT_VOID 0 /* void type */ 710 855 #define VT_BYTE 1 /* signed byte type */ 711 856 #define VT_SHORT 2 /* short type */ 712 #define VT_ VOID 3 /* voidtype */713 #define VT_ PTR 4 /* pointer */714 #define VT_ ENUM 5 /* enum definition*/857 #define VT_INT 3 /* integer type */ 858 #define VT_LLONG 4 /* 64 bit integer */ 859 #define VT_PTR 5 /* pointer */ 715 860 #define VT_FUNC 6 /* function type */ 716 861 #define VT_STRUCT 7 /* struct/union definition */ … … 719 864 #define VT_LDOUBLE 10 /* IEEE long double */ 720 865 #define VT_BOOL 11 /* ISOC99 boolean type */ 721 #define VT_ LLONG 12 /* 64 bit integer*/722 #define VT_ LONG 13 /* long integer (NEVER USED as type, only723 during parsing) */ 866 #define VT_QLONG 13 /* 128-bit integer. Only used for x86-64 ABI */ 867 #define VT_QFLOAT 14 /* 128-bit float. Only used for x86-64 ABI */ 868 724 869 #define VT_UNSIGNED 0x0010 /* unsigned type */ 725 #define VT_ARRAY 0x0020 /* array type (also has VT_PTR) */ 726 #define VT_BITFIELD 0x0040 /* bitfield modifier */ 727 #define VT_CONSTANT 0x0800 /* const modifier */ 728 #define VT_VOLATILE 0x1000 /* volatile modifier */ 729 #define VT_SIGNED 0x2000 /* signed type */ 730 #define VT_VLA 0x00020000 /* VLA type (also has VT_PTR and VT_ARRAY) */ 870 #define VT_DEFSIGN 0x0020 /* explicitly signed or unsigned */ 871 #define VT_ARRAY 0x0040 /* array type (also has VT_PTR) */ 872 #define VT_BITFIELD 0x0080 /* bitfield modifier */ 873 #define VT_CONSTANT 0x0100 /* const modifier */ 874 #define VT_VOLATILE 0x0200 /* volatile modifier */ 875 #define VT_VLA 0x0400 /* VLA type (also has VT_PTR and VT_ARRAY) */ 876 #define VT_LONG 0x0800 /* long type (also has VT_INT rsp. VT_LLONG) */ 731 877 732 878 /* storage */ 733 #define VT_EXTERN 0x00000080 /* extern definition */ 734 #define VT_STATIC 0x00000100 /* static variable */ 735 #define VT_TYPEDEF 0x00000200 /* typedef definition */ 736 #define VT_INLINE 0x00000400 /* inline definition */ 737 #define VT_IMPORT 0x00004000 /* win32: extern data imported from dll */ 738 #define VT_EXPORT 0x00008000 /* win32: data exported from dll */ 739 #define VT_WEAK 0x00010000 /* weak symbol */ 740 741 #define VT_STRUCT_SHIFT 18 /* shift for bitfield shift values (max: 32 - 2*6) */ 879 #define VT_EXTERN 0x00001000 /* extern definition */ 880 #define VT_STATIC 0x00002000 /* static variable */ 881 #define VT_TYPEDEF 0x00004000 /* typedef definition */ 882 #define VT_INLINE 0x00008000 /* inline definition */ 883 /* currently unused: 0x000[1248]0000 */ 884 885 #define VT_STRUCT_SHIFT 20 /* shift for bitfield shift values (32 - 2*6) */ 886 #define VT_STRUCT_MASK (((1 << (6+6)) - 1) << VT_STRUCT_SHIFT | VT_BITFIELD) 887 #define BIT_POS(t) (((t) >> VT_STRUCT_SHIFT) & 0x3f) 888 #define BIT_SIZE(t) (((t) >> (VT_STRUCT_SHIFT + 6)) & 0x3f) 889 890 #define VT_UNION (1 << VT_STRUCT_SHIFT | VT_STRUCT) 891 #define VT_ENUM (2 << VT_STRUCT_SHIFT) /* integral type is an enum really */ 892 #define VT_ENUM_VAL (3 << VT_STRUCT_SHIFT) /* integral type is an enum constant really */ 893 894 #define IS_ENUM(t) ((t & VT_STRUCT_MASK) == VT_ENUM) 895 #define IS_ENUM_VAL(t) ((t & VT_STRUCT_MASK) == VT_ENUM_VAL) 896 #define IS_UNION(t) ((t & (VT_STRUCT_MASK|VT_BTYPE)) == VT_UNION) 742 897 743 898 /* type mask (except storage) */ 744 #define VT_STORAGE (VT_EXTERN | VT_STATIC | VT_TYPEDEF | VT_INLINE | VT_IMPORT | VT_EXPORT | VT_WEAK) 745 #define VT_TYPE (~(VT_STORAGE)) 899 #define VT_STORAGE (VT_EXTERN | VT_STATIC | VT_TYPEDEF | VT_INLINE) 900 #define VT_TYPE (~(VT_STORAGE|VT_STRUCT_MASK)) 901 902 /* symbol was created by tccasm.c first */ 903 #define VT_ASM (VT_VOID | VT_UNSIGNED) 904 #define IS_ASM_SYM(sym) (((sym)->type.t & (VT_BTYPE | VT_ASM)) == VT_ASM) 746 905 747 906 /* token values */ … … 763 922 #define TOK_LAND 0xa0 764 923 #define TOK_LOR 0xa1 765 766 924 #define TOK_DEC 0xa2 767 925 #define TOK_MID 0xa3 /* inc/dec, to void constant */ … … 770 928 #define TOK_UMOD 0xb1 /* unsigned modulo */ 771 929 #define TOK_PDIV 0xb2 /* fast division with undefined rounding for pointers */ 772 #define TOK_CINT 0xb3 /* number in tokc */ 773 #define TOK_CCHAR 0xb4 /* char constant in tokc */ 774 #define TOK_STR 0xb5 /* pointer to string in tokc */ 775 #define TOK_TWOSHARPS 0xb6 /* ## preprocessing token */ 776 #define TOK_LCHAR 0xb7 777 #define TOK_LSTR 0xb8 778 #define TOK_CFLOAT 0xb9 /* float constant */ 779 #define TOK_LINENUM 0xba /* line number info */ 780 #define TOK_CDOUBLE 0xc0 /* double constant */ 781 #define TOK_CLDOUBLE 0xc1 /* long double constant */ 930 931 /* tokens that carry values (in additional token string space / tokc) --> */ 932 #define TOK_CCHAR 0xb3 /* char constant in tokc */ 933 #define TOK_LCHAR 0xb4 934 #define TOK_CINT 0xb5 /* number in tokc */ 935 #define TOK_CUINT 0xb6 /* unsigned int constant */ 936 #define TOK_CLLONG 0xb7 /* long long constant */ 937 #define TOK_CULLONG 0xb8 /* unsigned long long constant */ 938 #define TOK_STR 0xb9 /* pointer to string in tokc */ 939 #define TOK_LSTR 0xba 940 #define TOK_CFLOAT 0xbb /* float constant */ 941 #define TOK_CDOUBLE 0xbc /* double constant */ 942 #define TOK_CLDOUBLE 0xbd /* long double constant */ 943 #define TOK_PPNUM 0xbe /* preprocessor number */ 944 #define TOK_PPSTR 0xbf /* preprocessor string */ 945 #define TOK_LINENUM 0xc0 /* line number info */ 946 #define TOK_TWODOTS 0xa8 /* C++ token ? */ 947 /* <-- */ 948 782 949 #define TOK_UMULL 0xc2 /* unsigned 32x32 -> 64 mul */ 783 950 #define TOK_ADDC1 0xc3 /* add with carry generation */ … … 785 952 #define TOK_SUBC1 0xc5 /* add with carry generation */ 786 953 #define TOK_SUBC2 0xc6 /* add with carry use */ 787 #define TOK_CUINT 0xc8 /* unsigned int constant */ 788 #define TOK_CLLONG 0xc9 /* long long constant */ 789 #define TOK_CULLONG 0xca /* unsigned long long constant */ 790 #define TOK_ARROW 0xcb 791 #define TOK_DOTS 0xcc /* three dots */ 792 #define TOK_SHR 0xcd /* unsigned shift right */ 793 #define TOK_PPNUM 0xce /* preprocessor number */ 794 #define TOK_NOSUBST 0xcf /* means following token has already been pp'd */ 954 #define TOK_ARROW 0xc7 955 #define TOK_DOTS 0xc8 /* three dots */ 956 #define TOK_SHR 0xc9 /* unsigned shift right */ 957 #define TOK_TWOSHARPS 0xca /* ## preprocessing token */ 958 #define TOK_PLCHLDR 0xcb /* placeholder token as defined in C99 */ 959 #define TOK_NOSUBST 0xcc /* means following token has already been pp'd */ 960 #define TOK_PPJOIN 0xcd /* A '##' in the right position to mean pasting */ 961 #define TOK_CLONG 0xce /* long constant */ 962 #define TOK_CULONG 0xcf /* unsigned long constant */ 795 963 796 964 #define TOK_SHL 0x01 /* shift left */ 797 965 #define TOK_SAR 0x02 /* signed shift right */ 798 799 /* assign ement operators : normal operator or 0x80 */966 967 /* assignment operators : normal operator or 0x80 */ 800 968 #define TOK_A_MOD 0xa5 801 969 #define TOK_A_AND 0xa6 … … 809 977 #define TOK_A_SAR 0x82 810 978 811 #ifndef offsetof812 #define offsetof(type, field) ((size_t) &((type *)0)->field)813 #endif814 815 #ifndef countof816 #define countof(tab) (sizeof(tab) / sizeof((tab)[0]))817 #endif818 819 979 #define TOK_EOF (-1) /* end of file */ 820 980 #define TOK_LINEFEED 10 /* line feed */ 821 981 822 /* all identifi cators and strings have token above that */982 /* all identifiers and strings have token above that */ 823 983 #define TOK_IDENT 256 824 984 825 985 #define DEF_ASM(x) DEF(TOK_ASM_ ## x, #x) 826 986 #define TOK_ASM_int TOK_INT 827 #define TOK_ASM_weak TOK_WEAK1 987 #define DEF_ASMDIR(x) DEF(TOK_ASMDIR_ ## x, "." #x) 988 #define TOK_ASMDIR_FIRST TOK_ASMDIR_byte 989 #define TOK_ASMDIR_LAST TOK_ASMDIR_section 828 990 829 991 #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 … … 872 1034 DEF_FP1(x) 873 1035 874 #define DEF_ASMTEST(x ) \875 DEF_ASM(x ## o ) \876 DEF_ASM(x ## no ) \877 DEF_ASM(x ## b ) \878 DEF_ASM(x ## c ) \879 DEF_ASM(x ## nae ) \880 DEF_ASM(x ## nb ) \881 DEF_ASM(x ## nc ) \882 DEF_ASM(x ## ae ) \883 DEF_ASM(x ## e ) \884 DEF_ASM(x ## z ) \885 DEF_ASM(x ## ne ) \886 DEF_ASM(x ## nz ) \887 DEF_ASM(x ## be ) \888 DEF_ASM(x ## na ) \889 DEF_ASM(x ## nbe ) \890 DEF_ASM(x ## a ) \891 DEF_ASM(x ## s ) \892 DEF_ASM(x ## ns ) \893 DEF_ASM(x ## p ) \894 DEF_ASM(x ## pe ) \895 DEF_ASM(x ## np ) \896 DEF_ASM(x ## po ) \897 DEF_ASM(x ## l ) \898 DEF_ASM(x ## nge ) \899 DEF_ASM(x ## nl ) \900 DEF_ASM(x ## ge ) \901 DEF_ASM(x ## le ) \902 DEF_ASM(x ## ng ) \903 DEF_ASM(x ## nle ) \904 DEF_ASM(x ## g )905 906 #endif / / defined TCC_TARGET_I386 || defined TCC_TARGET_X86_641036 #define DEF_ASMTEST(x,suffix) \ 1037 DEF_ASM(x ## o ## suffix) \ 1038 DEF_ASM(x ## no ## suffix) \ 1039 DEF_ASM(x ## b ## suffix) \ 1040 DEF_ASM(x ## c ## suffix) \ 1041 DEF_ASM(x ## nae ## suffix) \ 1042 DEF_ASM(x ## nb ## suffix) \ 1043 DEF_ASM(x ## nc ## suffix) \ 1044 DEF_ASM(x ## ae ## suffix) \ 1045 DEF_ASM(x ## e ## suffix) \ 1046 DEF_ASM(x ## z ## suffix) \ 1047 DEF_ASM(x ## ne ## suffix) \ 1048 DEF_ASM(x ## nz ## suffix) \ 1049 DEF_ASM(x ## be ## suffix) \ 1050 DEF_ASM(x ## na ## suffix) \ 1051 DEF_ASM(x ## nbe ## suffix) \ 1052 DEF_ASM(x ## a ## suffix) \ 1053 DEF_ASM(x ## s ## suffix) \ 1054 DEF_ASM(x ## ns ## suffix) \ 1055 DEF_ASM(x ## p ## suffix) \ 1056 DEF_ASM(x ## pe ## suffix) \ 1057 DEF_ASM(x ## np ## suffix) \ 1058 DEF_ASM(x ## po ## suffix) \ 1059 DEF_ASM(x ## l ## suffix) \ 1060 DEF_ASM(x ## nge ## suffix) \ 1061 DEF_ASM(x ## nl ## suffix) \ 1062 DEF_ASM(x ## ge ## suffix) \ 1063 DEF_ASM(x ## le ## suffix) \ 1064 DEF_ASM(x ## ng ## suffix) \ 1065 DEF_ASM(x ## nle ## suffix) \ 1066 DEF_ASM(x ## g ## suffix) 1067 1068 #endif /* defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 */ 907 1069 908 1070 enum tcc_token { 909 TOK_LAST = TOK_IDENT - 1 ,910 #define DEF(id, str) id,1071 TOK_LAST = TOK_IDENT - 1 1072 #define DEF(id, str) ,id 911 1073 #include "tcctok.h" 912 1074 #undef DEF 913 1075 }; 914 1076 1077 /* keywords: tok >= TOK_IDENT && tok < TOK_UIDENT */ 915 1078 #define TOK_UIDENT TOK_DEFINE 916 917 #if 0//def _WIN32918 #define snprintf _snprintf919 #define vsnprintf _vsnprintf920 #ifndef __GNUC__921 #define strtold (long double)strtod922 #define strtof (float)strtod923 #define strtoll _strtoi64924 #define strtoull _strtoui64925 #endif926 #else927 /* XXX: need to define this to use them in non ISOC99 context */928 extern float strtof (const char *__nptr, char **__endptr);929 extern long double strtold (const char *__nptr, char **__endptr);930 #endif931 932 #ifdef _WIN32933 #define IS_DIRSEP(c) (c == '/' || c == '\\')934 #define IS_ABSPATH(p) (IS_DIRSEP(p[0]) || (p[0] && p[1] == ':' && IS_DIRSEP(p[2])))935 #define PATHCMP stricmp936 #else937 #define IS_DIRSEP(c) (c == '/')938 #define IS_ABSPATH(p) IS_DIRSEP(p[0])939 #define PATHCMP strcmp940 #endif941 942 #ifdef TCC_TARGET_PE943 #define PATHSEP ';'944 #else945 #define PATHSEP ':'946 #endif947 948 /* space exlcuding newline */949 static inline int is_space(int ch)950 {951 return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r';952 }953 954 static inline int isid(int c)955 {956 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';957 }958 959 static inline int isnum(int c)960 {961 return c >= '0' && c <= '9';962 }963 964 static inline int isoct(int c)965 {966 return c >= '0' && c <= '7';967 }968 969 static inline int toup(int c)970 {971 return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;972 }973 974 #ifndef PUB_FUNC975 # define PUB_FUNC976 #endif977 978 #ifdef ONE_SOURCE979 #define ST_INLN static inline980 #define ST_FUNC static981 #define ST_DATA static982 #else983 #define ST_INLN984 #define ST_FUNC985 #define ST_DATA extern986 #endif987 1079 988 1080 /* ------------ libtcc.c ------------ */ … … 995 1087 ST_DATA struct TCCState *tcc_state; 996 1088 997 #ifdef MEM_DEBUG998 ST_DATA int mem_cur_size;999 ST_DATA int mem_max_size;1000 #endif1001 1002 #define AFF_PRINT_ERROR 0x0001 /* print error if file not found */1003 #define AFF_REFERENCED_DLL 0x0002 /* load a referenced dll from another dll */1004 #define AFF_PREPROCESS 0x0004 /* preprocess file */1005 1006 1089 /* public functions currently used by the tcc main function */ 1007 PUB_FUNC char *pstrcpy(char *buf, int buf_size, const char *s);1008 PUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s);1009 PUB_FUNC char *pstrncpy(char *out, const char *in, size_t num);1090 ST_FUNC char *pstrcpy(char *buf, int buf_size, const char *s); 1091 ST_FUNC char *pstrcat(char *buf, int buf_size, const char *s); 1092 ST_FUNC char *pstrncpy(char *out, const char *in, size_t num); 1010 1093 PUB_FUNC char *tcc_basename(const char *name); 1011 1094 PUB_FUNC char *tcc_fileextension (const char *name); 1095 1096 #ifndef MEM_DEBUG 1012 1097 PUB_FUNC void tcc_free(void *ptr); 1013 1098 PUB_FUNC void *tcc_malloc(unsigned long size); … … 1015 1100 PUB_FUNC void *tcc_realloc(void *ptr, unsigned long size); 1016 1101 PUB_FUNC char *tcc_strdup(const char *str); 1102 #else 1103 #define tcc_free(ptr) tcc_free_debug(ptr) 1104 #define tcc_malloc(size) tcc_malloc_debug(size, __FILE__, __LINE__) 1105 #define tcc_mallocz(size) tcc_mallocz_debug(size, __FILE__, __LINE__) 1106 #define tcc_realloc(ptr,size) tcc_realloc_debug(ptr, size, __FILE__, __LINE__) 1107 #define tcc_strdup(str) tcc_strdup_debug(str, __FILE__, __LINE__) 1108 PUB_FUNC void tcc_free_debug(void *ptr); 1109 PUB_FUNC void *tcc_malloc_debug(unsigned long size, const char *file, int line); 1110 PUB_FUNC void *tcc_mallocz_debug(unsigned long size, const char *file, int line); 1111 PUB_FUNC void *tcc_realloc_debug(void *ptr, unsigned long size, const char *file, int line); 1112 PUB_FUNC char *tcc_strdup_debug(const char *str, const char *file, int line); 1113 #endif 1114 1017 1115 #define free(p) use_tcc_free(p) 1018 1116 #define malloc(s) use_tcc_malloc(s) … … 1020 1118 #undef strdup 1021 1119 #define strdup(s) use_tcc_strdup(s) 1022 PUB_FUNC void tcc_mem stats(void);1120 PUB_FUNC void tcc_memcheck(void); 1023 1121 PUB_FUNC void tcc_error_noabort(const char *fmt, ...); 1024 PUB_FUNC void tcc_error(const char *fmt, ...);1122 PUB_FUNC NORETURN void tcc_error(const char *fmt, ...); 1025 1123 PUB_FUNC void tcc_warning(const char *fmt, ...); 1026 1124 1027 1125 /* other utilities */ 1028 ST_FUNC void dynarray_add(void * **ptab, int *nb_ptr, void *data);1126 ST_FUNC void dynarray_add(void *ptab, int *nb_ptr, void *data); 1029 1127 ST_FUNC void dynarray_reset(void *pp, int *n); 1030 ST_ FUNCvoid cstr_ccat(CString *cstr, int ch);1031 ST_FUNC void cstr_cat(CString *cstr, const char *str );1128 ST_INLN void cstr_ccat(CString *cstr, int ch); 1129 ST_FUNC void cstr_cat(CString *cstr, const char *str, int len); 1032 1130 ST_FUNC void cstr_wccat(CString *cstr, int ch); 1033 1131 ST_FUNC void cstr_new(CString *cstr); … … 1035 1133 ST_FUNC void cstr_reset(CString *cstr); 1036 1134 1037 ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags);1038 ST_FUNC void section_realloc(Section *sec, unsigned long new_size);1039 ST_FUNC void *section_ptr_add(Section *sec, unsigned long size);1040 ST_FUNC void section_reserve(Section *sec, unsigned long size);1041 ST_FUNC Section *find_section(TCCState *s1, const char *name);1042 1043 ST_FUNC void put_extern_sym2(Sym *sym, Section *section, addr_t value, unsigned long size, int can_add_underscore);1044 ST_FUNC void put_extern_sym(Sym *sym, Section *section, addr_t value, unsigned long size);1045 ST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type);1046 1047 1135 ST_INLN void sym_free(Sym *sym); 1048 ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, longc);1136 ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, int c); 1049 1137 ST_FUNC Sym *sym_find2(Sym *s, int v); 1050 1138 ST_FUNC Sym *sym_push(int v, CType *type, int r, int c); 1051 ST_FUNC void sym_pop(Sym **ptop, Sym *b );1139 ST_FUNC void sym_pop(Sym **ptop, Sym *b, int keep); 1052 1140 ST_INLN Sym *struct_find(int v); 1053 1141 ST_INLN Sym *sym_find(int v); … … 1059 1147 1060 1148 ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags); 1149 /* flags: */ 1150 #define AFF_PRINT_ERROR 0x10 /* print error if file not found */ 1151 #define AFF_REFERENCED_DLL 0x20 /* load a referenced dll from another dll */ 1152 #define AFF_TYPE_BIN 0x40 /* file to add is binary */ 1153 /* s->filetype: */ 1154 #define AFF_TYPE_NONE 0 1155 #define AFF_TYPE_C 1 1156 #define AFF_TYPE_ASM 2 1157 #define AFF_TYPE_ASMPP 3 1158 #define AFF_TYPE_LIB 4 1159 /* values from tcc_object_type(...) */ 1160 #define AFF_BINTYPE_REL 1 1161 #define AFF_BINTYPE_DYN 2 1162 #define AFF_BINTYPE_AR 3 1163 #define AFF_BINTYPE_C67 4 1164 1165 1061 1166 ST_FUNC int tcc_add_crt(TCCState *s, const char *filename); 1062 1167 ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags); 1063 1064 PUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time); 1065 PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv); 1168 ST_FUNC void tcc_add_pragma_libs(TCCState *s1); 1169 PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f); 1170 PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time); 1171 PUB_FUNC int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind); 1172 #ifdef _WIN32 1173 ST_FUNC char *normalize_slashes(char *path); 1174 #endif 1175 1176 /* tcc_parse_args return codes: */ 1177 #define OPT_HELP 1 1178 #define OPT_HELP2 2 1179 #define OPT_V 3 1180 #define OPT_PRINT_DIRS 4 1181 #define OPT_AR 5 1182 #define OPT_IMPDEF 6 1183 #define OPT_M32 32 1184 #define OPT_M64 64 1066 1185 1067 1186 /* ------------ tccpp.c ------------ */ … … 1091 1210 token. line feed is also 1092 1211 returned at eof */ 1093 #define PARSE_FLAG_ASM_ COMMENTS 0x0008 /* '#' can be used for line comment*/1212 #define PARSE_FLAG_ASM_FILE 0x0008 /* we processing an asm file: '#' can be used for line comment, etc. */ 1094 1213 #define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */ 1214 #define PARSE_FLAG_ACCEPT_STRAYS 0x0020 /* next() returns '\\' token */ 1215 #define PARSE_FLAG_TOK_STR 0x0040 /* return parsed strings instead of TOK_PPSTR */ 1216 1217 /* isidnum_table flags: */ 1218 #define IS_SPC 1 1219 #define IS_ID 2 1220 #define IS_NUM 4 1095 1221 1096 1222 ST_FUNC TokenSym *tok_alloc(const char *str, int len); 1097 ST_FUNC char *get_tok_str(int v, CValue *cv); 1098 ST_FUNC void save_parse_state(ParseState *s); 1099 ST_FUNC void restore_parse_state(ParseState *s); 1223 ST_FUNC const char *get_tok_str(int v, CValue *cv); 1224 ST_FUNC void begin_macro(TokenString *str, int alloc); 1225 ST_FUNC void end_macro(void); 1226 ST_FUNC int set_idnum(int c, int val); 1100 1227 ST_INLN void tok_str_new(TokenString *s); 1101 ST_FUNC void tok_str_free(int *str); 1228 ST_FUNC TokenString *tok_str_alloc(void); 1229 ST_FUNC void tok_str_free(TokenString *s); 1230 ST_FUNC void tok_str_free_str(int *str); 1102 1231 ST_FUNC void tok_str_add(TokenString *s, int t); 1103 1232 ST_FUNC void tok_str_add_tok(TokenString *s); … … 1108 1237 ST_FUNC Sym *label_find(int v); 1109 1238 ST_FUNC Sym *label_push(Sym **ptop, int v, int flags); 1110 ST_FUNC void label_pop(Sym **ptop, Sym *slast );1239 ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep); 1111 1240 ST_FUNC void parse_define(void); 1112 1241 ST_FUNC void preprocess(int is_bof); … … 1114 1243 ST_FUNC void next(void); 1115 1244 ST_INLN void unget_tok(int last_tok); 1116 ST_FUNC void preprocess_init(TCCState *s1); 1117 ST_FUNC void preprocess_new(void); 1245 ST_FUNC void preprocess_start(TCCState *s1, int is_asm); 1246 ST_FUNC void preprocess_end(TCCState *s1); 1247 ST_FUNC void tccpp_new(TCCState *s); 1248 ST_FUNC void tccpp_delete(TCCState *s); 1118 1249 ST_FUNC int tcc_preprocess(TCCState *s1); 1119 1250 ST_FUNC void skip(int c); 1120 ST_FUNC void expect(const char *msg); 1251 ST_FUNC NORETURN void expect(const char *msg); 1252 1253 /* space excluding newline */ 1254 static inline int is_space(int ch) { 1255 return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r'; 1256 } 1257 static inline int isid(int c) { 1258 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; 1259 } 1260 static inline int isnum(int c) { 1261 return c >= '0' && c <= '9'; 1262 } 1263 static inline int isoct(int c) { 1264 return c >= '0' && c <= '7'; 1265 } 1266 static inline int toup(int c) { 1267 return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; 1268 } 1121 1269 1122 1270 /* ------------ tccgen.c ------------ */ 1123 1124 ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */1125 ST_DATA Section *cur_text_section; /* current section where function code is generated */1126 #ifdef CONFIG_TCC_ASM1127 ST_DATA Section *last_text_section; /* to handle .previous asm directive */1128 #endif1129 #ifdef CONFIG_TCC_BCHECK1130 /* bound check related sections */1131 ST_DATA Section *bounds_section; /* contains global data bound description */1132 ST_DATA Section *lbounds_section; /* contains local data bound description */1133 #endif1134 /* symbol sections */1135 ST_DATA Section *symtab_section, *strtab_section;1136 /* debug sections */1137 ST_DATA Section *stab_section, *stabstr_section;1138 1271 1139 1272 #define SYM_POOL_NB (8192 / sizeof(Sym)) … … 1148 1281 ST_DATA Sym *define_stack; 1149 1282 ST_DATA CType char_pointer_type, func_old_type, int_type, size_type; 1150 ST_DATA SValue __vstack[1+/*to make bcheck happy*/ VSTACK_SIZE], *vtop ;1283 ST_DATA SValue __vstack[1+/*to make bcheck happy*/ VSTACK_SIZE], *vtop, *pvtop; 1151 1284 #define vstack (__vstack + 1) 1152 1285 ST_DATA int rsym, anon_sym, ind, loc; … … 1156 1289 ST_DATA int global_expr; /* true if compound literals must be allocated globally (used during initializers parsing */ 1157 1290 ST_DATA CType func_vt; /* current function return type (used by return instruction) */ 1291 ST_DATA int func_var; /* true if current function is variadic */ 1158 1292 ST_DATA int func_vc; 1159 1293 ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */ 1160 ST_DATA char *funcname; 1294 ST_DATA const char *funcname; 1295 ST_DATA int g_debug; 1296 1297 ST_FUNC void tcc_debug_start(TCCState *s1); 1298 ST_FUNC void tcc_debug_end(TCCState *s1); 1299 ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym); 1300 ST_FUNC void tcc_debug_funcend(TCCState *s1, int size); 1301 ST_FUNC void tcc_debug_line(TCCState *s1); 1302 1303 ST_FUNC int tccgen_compile(TCCState *s1); 1304 ST_FUNC void free_inline_functions(TCCState *s); 1305 ST_FUNC void check_vstack(void); 1161 1306 1162 1307 ST_INLN int is_float(int t); 1163 1308 ST_FUNC int ieee_finite(double d); 1164 1309 ST_FUNC void test_lvalue(void); 1165 ST_FUNC void swap(int *p, int *q);1166 1310 ST_FUNC void vpushi(int v); 1311 ST_FUNC ElfSym *elfsym(Sym *); 1312 ST_FUNC void update_storage(Sym *sym); 1167 1313 ST_FUNC Sym *external_global_sym(int v, CType *type, int r); 1168 1314 ST_FUNC void vset(CType *type, int r, int v); … … 1178 1324 ST_FUNC void vpushv(SValue *v); 1179 1325 ST_FUNC void save_reg(int r); 1326 ST_FUNC void save_reg_upstack(int r, int n); 1180 1327 ST_FUNC int get_reg(int rc); 1181 1328 ST_FUNC void save_regs(int n); 1329 ST_FUNC void gaddrof(void); 1182 1330 ST_FUNC int gv(int rc); 1183 1331 ST_FUNC void gv2(int rc1, int rc2); … … 1188 1336 ST_FUNC void vstore(void); 1189 1337 ST_FUNC void inc(int post, int c); 1338 ST_FUNC void parse_mult_str (CString *astr, const char *msg); 1190 1339 ST_FUNC void parse_asm_str(CString *astr); 1191 1340 ST_FUNC int lvalue_type(int t); … … 1196 1345 ST_FUNC void gexpr(void); 1197 1346 ST_FUNC int expr_const(void); 1198 ST_FUNC void gen_inline_functions(void);1199 ST_FUNC void decl(int l);1200 1347 #if defined CONFIG_TCC_BCHECK || defined TCC_TARGET_C67 1201 1348 ST_FUNC Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size); 1349 #endif 1350 #if defined TCC_TARGET_X86_64 && !defined TCC_TARGET_PE 1351 ST_FUNC int classify_x86_64_va_arg(CType *ty); 1202 1352 #endif 1203 1353 … … 1218 1368 } Stab_Sym; 1219 1369 1370 ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */ 1371 ST_DATA Section *common_section; 1372 ST_DATA Section *cur_text_section; /* current section where function code is generated */ 1373 #ifdef CONFIG_TCC_ASM 1374 ST_DATA Section *last_text_section; /* to handle .previous asm directive */ 1375 #endif 1376 #ifdef CONFIG_TCC_BCHECK 1377 /* bound check related sections */ 1378 ST_DATA Section *bounds_section; /* contains global data bound description */ 1379 ST_DATA Section *lbounds_section; /* contains local data bound description */ 1380 ST_FUNC void tccelf_bounds_new(TCCState *s); 1381 #endif 1382 /* symbol sections */ 1383 ST_DATA Section *symtab_section; 1384 /* debug sections */ 1385 ST_DATA Section *stab_section, *stabstr_section; 1386 1387 ST_FUNC void tccelf_new(TCCState *s); 1388 ST_FUNC void tccelf_delete(TCCState *s); 1389 ST_FUNC void tccelf_stab_new(TCCState *s); 1390 ST_FUNC void tccelf_begin_file(TCCState *s1); 1391 ST_FUNC void tccelf_end_file(TCCState *s1); 1392 1393 ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags); 1394 ST_FUNC void section_realloc(Section *sec, unsigned long new_size); 1395 ST_FUNC size_t section_add(Section *sec, addr_t size, int align); 1396 ST_FUNC void *section_ptr_add(Section *sec, addr_t size); 1397 ST_FUNC void section_reserve(Section *sec, unsigned long size); 1398 ST_FUNC Section *find_section(TCCState *s1, const char *name); 1220 1399 ST_FUNC Section *new_symtab(TCCState *s1, const char *symtab_name, int sh_type, int sh_flags, const char *strtab_name, const char *hash_name, int hash_sh_flags); 1400 1401 ST_FUNC void put_extern_sym2(Sym *sym, int sh_num, addr_t value, unsigned long size, int can_add_underscore); 1402 ST_FUNC void put_extern_sym(Sym *sym, Section *section, addr_t value, unsigned long size); 1403 #if PTR_SIZE == 4 1404 ST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type); 1405 #endif 1406 ST_FUNC void greloca(Section *s, Sym *sym, unsigned long offset, int type, addr_t addend); 1221 1407 1222 1408 ST_FUNC int put_elf_str(Section *s, const char *sym); 1223 1409 ST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int shndx, const char *name); 1224 ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int sh_num, const char *name);1410 ST_FUNC int set_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int shndx, const char *name); 1225 1411 ST_FUNC int find_elf_sym(Section *s, const char *name); 1226 1412 ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol); 1413 ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, addr_t addend); 1227 1414 1228 1415 ST_FUNC void put_stabs(const char *str, int type, int other, int desc, unsigned long value); … … 1231 1418 ST_FUNC void put_stabd(int type, int other, int desc); 1232 1419 1233 ST_FUNC void re locate_common_syms(void);1234 ST_FUNC void relocate_syms(TCCState *s1, int do_resolve);1420 ST_FUNC void resolve_common_syms(TCCState *s1); 1421 ST_FUNC void relocate_syms(TCCState *s1, Section *symtab, int do_resolve); 1235 1422 ST_FUNC void relocate_section(TCCState *s1, Section *s); 1236 1423 1237 ST_FUNC void tcc_add_linker_symbols(TCCState *s1);1424 ST_FUNC int tcc_object_type(int fd, ElfW(Ehdr) *h); 1238 1425 ST_FUNC int tcc_load_object_file(TCCState *s1, int fd, unsigned long file_offset); 1239 1426 ST_FUNC int tcc_load_archive(TCCState *s1, int fd); 1240 1427 ST_FUNC void tcc_add_bcheck(TCCState *s1); 1428 ST_FUNC void tcc_add_runtime(TCCState *s1); 1241 1429 1242 1430 ST_FUNC void build_got_entries(TCCState *s1); 1243 ST_FUNC void tcc_add_runtime(TCCState *s1); 1431 ST_FUNC struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc); 1432 ST_FUNC void squeeze_multi_relocs(Section *sec, size_t oldrelocoffset); 1244 1433 1245 1434 ST_FUNC addr_t get_elf_sym_addr(TCCState *s, const char *name, int err); 1246 #if def TCC_IS_NATIVE1435 #if defined TCC_IS_NATIVE || defined TCC_TARGET_PE 1247 1436 ST_FUNC void *tcc_get_symbol_err(TCCState *s, const char *name); 1248 1437 #endif … … 1257 1446 #endif 1258 1447 1448 /* ------------ xxx-link.c ------------ */ 1449 1450 /* Whether to generate a GOT/PLT entry and when. NO_GOTPLT_ENTRY is first so 1451 that unknown relocation don't create a GOT or PLT entry */ 1452 enum gotplt_entry { 1453 NO_GOTPLT_ENTRY, /* never generate (eg. GLOB_DAT & JMP_SLOT relocs) */ 1454 BUILD_GOT_ONLY, /* only build GOT (eg. TPOFF relocs) */ 1455 AUTO_GOTPLT_ENTRY, /* generate if sym is UNDEF */ 1456 ALWAYS_GOTPLT_ENTRY /* always generate (eg. PLTOFF relocs) */ 1457 }; 1458 1459 ST_FUNC int code_reloc (int reloc_type); 1460 ST_FUNC int gotplt_entry_type (int reloc_type); 1461 ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr); 1462 ST_FUNC void relocate_init(Section *sr); 1463 ST_FUNC void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val); 1464 ST_FUNC void relocate_plt(TCCState *s1); 1465 1259 1466 /* ------------ xxx-gen.c ------------ */ 1260 1467 1261 #ifdef TCC_TARGET_X86_641262 ST_DATA const int reg_classes[NB_REGS+7];1263 #else1264 1468 ST_DATA const int reg_classes[NB_REGS]; 1265 #endif1266 1469 1267 1470 ST_FUNC void gsym_addr(int t, int a); … … 1269 1472 ST_FUNC void load(int r, SValue *sv); 1270 1473 ST_FUNC void store(int r, SValue *v); 1474 ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *align, int *regsize); 1271 1475 ST_FUNC void gfunc_call(int nb_args); 1272 1476 ST_FUNC void gfunc_prolog(CType *func_type); … … 1275 1479 ST_FUNC void gjmp_addr(int a); 1276 1480 ST_FUNC int gtst(int inv, int t); 1481 #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 1482 ST_FUNC void gtst_addr(int inv, int a); 1483 #else 1484 #define gtst_addr(inv, a) gsym_addr(gtst(inv, 0), a) 1485 #endif 1277 1486 ST_FUNC void gen_opi(int op); 1278 1487 ST_FUNC void gen_opf(int op); … … 1286 1495 ST_FUNC void gen_cvt_itof(int t); 1287 1496 #endif 1497 ST_FUNC void gen_vla_sp_save(int addr); 1498 ST_FUNC void gen_vla_sp_restore(int addr); 1499 ST_FUNC void gen_vla_alloc(CType *type, int align); 1500 1501 static inline uint16_t read16le(unsigned char *p) { 1502 return p[0] | (uint16_t)p[1] << 8; 1503 } 1504 static inline void write16le(unsigned char *p, uint16_t x) { 1505 p[0] = x & 255; p[1] = x >> 8 & 255; 1506 } 1507 static inline uint32_t read32le(unsigned char *p) { 1508 return read16le(p) | (uint32_t)read16le(p + 2) << 16; 1509 } 1510 static inline void write32le(unsigned char *p, uint32_t x) { 1511 write16le(p, x); write16le(p + 2, x >> 16); 1512 } 1513 static inline void add32le(unsigned char *p, int32_t x) { 1514 write32le(p, read32le(p) + x); 1515 } 1516 static inline uint64_t read64le(unsigned char *p) { 1517 return read32le(p) | (uint64_t)read32le(p + 4) << 32; 1518 } 1519 static inline void write64le(unsigned char *p, uint64_t x) { 1520 write32le(p, x); write32le(p + 4, x >> 32); 1521 } 1522 static inline void add64le(unsigned char *p, int64_t x) { 1523 write64le(p, read64le(p) + x); 1524 } 1288 1525 1289 1526 /* ------------ i386-gen.c ------------ */ 1290 1527 #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 1291 1528 ST_FUNC void g(int c); 1292 ST_FUNC int oad(int c, int s);1293 1529 ST_FUNC void gen_le16(int c); 1294 1530 ST_FUNC void gen_le32(int c); … … 1306 1542 ST_FUNC void gen_addr64(int r, Sym *sym, int64_t c); 1307 1543 ST_FUNC void gen_opl(int op); 1544 #ifdef TCC_TARGET_PE 1545 ST_FUNC void gen_vla_result(int addr); 1546 #endif 1308 1547 #endif 1309 1548 1310 1549 /* ------------ arm-gen.c ------------ */ 1311 1550 #ifdef TCC_TARGET_ARM 1312 ST_FUNC void arm_init_types(void); 1313 ST_FUNC uint32_t encbranch(int pos, int addr, int fail); 1551 #if defined(TCC_ARM_EABI) && !defined(CONFIG_TCC_ELFINTERP) 1552 PUB_FUNC const char *default_elfinterp(struct TCCState *s); 1553 #endif 1554 ST_FUNC void arm_init(struct TCCState *s); 1314 1555 ST_FUNC void gen_cvt_itof1(int t); 1556 #endif 1557 1558 /* ------------ arm64-gen.c ------------ */ 1559 #ifdef TCC_TARGET_ARM64 1560 ST_FUNC void gen_cvt_sxtw(void); 1561 ST_FUNC void gen_opl(int op); 1562 ST_FUNC void gfunc_return(CType *func_type); 1563 ST_FUNC void gen_va_start(void); 1564 ST_FUNC void gen_va_arg(CType *t); 1565 ST_FUNC void gen_clear_cache(void); 1315 1566 #endif 1316 1567 … … 1331 1582 #ifdef CONFIG_TCC_ASM 1332 1583 ST_FUNC int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp); 1584 ST_FUNC Sym* get_asm_sym(int name, Sym *csym); 1333 1585 ST_FUNC void asm_expr(TCCState *s1, ExprValue *pe); 1334 1586 ST_FUNC int asm_int_expr(TCCState *s1); … … 1336 1588 /* ------------ i386-asm.c ------------ */ 1337 1589 ST_FUNC void gen_expr32(ExprValue *pe); 1590 #ifdef TCC_TARGET_X86_64 1591 ST_FUNC void gen_expr64(ExprValue *pe); 1592 #endif 1338 1593 ST_FUNC void asm_opcode(TCCState *s1, int opcode); 1594 ST_FUNC int asm_parse_regvar(int t); 1339 1595 ST_FUNC void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg); 1340 1596 ST_FUNC void subst_asm_operand(CString *add_str, SValue *sv, int modifier); … … 1348 1604 ST_FUNC int pe_output_file(TCCState * s1, const char *filename); 1349 1605 ST_FUNC int pe_putimport(TCCState *s1, int dllindex, const char *name, addr_t value); 1606 #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 1350 1607 ST_FUNC SValue *pe_getimport(SValue *sv, SValue *v2); 1608 #endif 1351 1609 #ifdef TCC_TARGET_X86_64 1352 1610 ST_FUNC void pe_add_unwind_data(unsigned start, unsigned end, unsigned stack); 1353 1611 #endif 1354 #endif 1612 PUB_FUNC int tcc_get_dllexports(const char *filename, char **pp); 1613 /* symbol properties stored in Elf32_Sym->st_other */ 1614 # define ST_PE_EXPORT 0x10 1615 # define ST_PE_IMPORT 0x20 1616 # define ST_PE_STDCALL 0x40 1617 #endif 1618 #define ST_ASM_SET 0x04 1355 1619 1356 1620 /* ------------ tccrun.c ----------------- */ … … 1365 1629 ST_FUNC void dlclose(void *p); 1366 1630 ST_FUNC const char *dlerror(void); 1367 ST_FUNC void *resolve_sym(TCCState *s1, const char *symbol); 1368 #elif !defined _WIN32 1369 ST_FUNC void *resolve_sym(TCCState *s1, const char *symbol); 1370 #endif 1371 1631 ST_FUNC void *dlsym(void *handle, const char *symbol); 1632 #endif 1372 1633 #ifdef CONFIG_TCC_BACKTRACE 1373 1634 ST_DATA int rt_num_callers; … … 1376 1637 ST_FUNC void tcc_set_num_callers(int n); 1377 1638 #endif 1639 ST_FUNC void tcc_run_free(TCCState *s1); 1640 #endif 1641 1642 /* ------------ tcctools.c ----------------- */ 1643 #if 0 /* included in tcc.c */ 1644 ST_FUNC int tcc_tool_ar(TCCState *s, int argc, char **argv); 1645 #ifdef TCC_TARGET_PE 1646 ST_FUNC int tcc_tool_impdef(TCCState *s, int argc, char **argv); 1647 #endif 1648 ST_FUNC void tcc_tool_cross(TCCState *s, char **argv, int option); 1649 ST_FUNC void gen_makedeps(TCCState *s, const char *target, const char *filename); 1378 1650 #endif 1379 1651 1380 1652 /********************************************************/ 1381 1653 #undef ST_DATA 1382 #if defONE_SOURCE1654 #if ONE_SOURCE 1383 1655 #define ST_DATA static 1384 1656 #else
Note:
See TracChangeset
for help on using the changeset viewer.