Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

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  
    11/*
    22 *  TCC - Tiny C Compiler
    3  * 
     3 *
    44 *  Copyright (c) 2001-2004 Fabrice Bellard
    55 *
     
    2525#include "config.h"
    2626
    27 #ifdef CONFIG_TCCBOOT
    28 #include "tccboot.h"
    29 #define CONFIG_TCC_STATIC
    30 #else
    31 
    3227#include <stdlib.h>
    3328#include <stdio.h>
     
    3631#include <errno.h>
    3732#include <math.h>
    38 #include <signal.h>
    39 #define SA_RESETHAND  0x80000000
    40 #define FPE_INTDIV 1
    41 #define FPE_FLTDIV 3
    42 typedef struct { int si_signo, si_errno, si_code; } siginfo_t;
    4333#include <fcntl.h>
    4434#include <setjmp.h>
     
    4838# include <unistd.h>
    4939# include <sys/time.h>
    50 /*# include <sys/ucontext.h>*/
    51 typedef struct __ucontext ucontext_t;
    52 /*# include <sys/mman.h>*/
    53 #define PROT_READ      1
    54 #define PROT_WRITE     2
    55 #define PROT_EXEC      4
    5640# ifndef CONFIG_TCC_STATIC
    5741#  include <dlfcn.h>
    5842# 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 */
     44extern float strtof (const char *__nptr, char **__endptr);
     45extern 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__
    6453#  include <stdint.h>
     54# endif
    6555# 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
    6764# ifdef LIBTCC_AS_DLL
    6865#  define LIBTCCAPI __declspec(dllexport)
    6966#  define PUB_FUNC LIBTCCAPI
    7067# 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
    7479
    7580#ifndef O_BINARY
     
    7782#endif
    7883
    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))
    8995#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/* -------------------------------------------- */
    103113
    104114/* parser debug */
    105 //#define PARSE_DEBUG
     115/* #define PARSE_DEBUG */
    106116/* preprocessor debug */
    107 //#define PP_DEBUG
     117/* #define PP_DEBUG */
    108118/* include file debug */
    109 //#define INC_DEBUG
     119/* #define INC_DEBUG */
    110120/* memory leak debug */
    111 //#define MEM_DEBUG
     121/* #define MEM_DEBUG */
    112122/* assembler debug */
    113 //#define ASM_DEBUG
     123/* #define ASM_DEBUG */
    114124
    115125/* target selection */
    116 //#define TCC_TARGET_I386   /* i386 code generator */
    117 //#define TCC_TARGET_ARM    /* ARMv4 code generator */
    118 //#define TCC_TARGET_C67    /* TMS320C67xx code generator */
    119 //#define TCC_TARGET_X86_64 /* x86-64 code generator */
    120 //#define TCC_TARGET_IL   /* IL code 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 */
    121131
    122132/* default target is I386 */
    123133#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
    142150#endif
    143151
     
    150158# elif defined __arm__ && defined TCC_TARGET_ARM
    151159#  define TCC_IS_NATIVE
     160# elif defined __aarch64__ && defined TCC_TARGET_ARM64
     161#  define TCC_IS_NATIVE
    152162# endif
    153163#endif
     
    155165#if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT
    156166# 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
    157171#endif
    158172
     
    163177#endif
    164178#ifndef CONFIG_TCCDIR
    165 # define CONFIG_TCCDIR "."
     179# define CONFIG_TCCDIR "/usr/local/lib/tcc"
    166180#endif
    167181#ifndef CONFIG_LDDIR
    168182# define CONFIG_LDDIR "lib"
    169183#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
    170191
    171192/* path to find crt1.o, crti.o and crtn.o */
    172193#ifndef CONFIG_TCC_CRTPREFIX
    173 # define CONFIG_TCC_CRTPREFIX CONFIG_SYSROOT "/usr/" CONFIG_LDDIR
     194# define CONFIG_TCC_CRTPREFIX USE_TRIPLET(CONFIG_SYSROOT "/usr/" CONFIG_LDDIR)
    174195#endif
    175196
     
    179200#ifndef CONFIG_TCC_SYSINCLUDEPATHS
    180201# 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"
    189203# else
    190204#  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")
    194208# endif
    195209#endif
     
    201215# else
    202216#  define CONFIG_TCC_LIBPATHS \
    203         CONFIG_SYSROOT "/usr/" CONFIG_LDDIR \
    204     ":" CONFIG_SYSROOT "/" CONFIG_LDDIR \
    205     ":" CONFIG_SYSROOT "/usr/local/" CONFIG_LDDIR
     217        ALSO_TRIPLET(CONFIG_SYSROOT "/usr/" CONFIG_LDDIR) \
     218    ":" ALSO_TRIPLET(CONFIG_SYSROOT "/" CONFIG_LDDIR) \
     219    ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/local/" CONFIG_LDDIR)
    206220# endif
    207221#endif
     
    212226#  define CONFIG_TCC_ELFINTERP "/libexec/ld-elf.so.1"
    213227# 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"
    223239# elif defined(TCC_TARGET_PE)
    224240#  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
    227261# endif
    228262#endif
    229263
     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
    230276/* 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
    232310
    233311/* -------------------------------------------- */
     
    237315#ifdef TCC_TARGET_I386
    238316# include "i386-gen.c"
     317# include "i386-link.c"
    239318#endif
    240319#ifdef TCC_TARGET_X86_64
    241320# include "x86_64-gen.c"
     321# include "x86_64-link.c"
    242322#endif
    243323#ifdef TCC_TARGET_ARM
    244324# 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"
    245331#endif
    246332#ifdef TCC_TARGET_C67
     333# define TCC_TARGET_COFF
    247334# include "coff.h"
    248335# include "c67-gen.c"
    249 #endif
    250 #ifdef TCC_TARGET_IL
    251 #include "il-gen.c"
     336# include "c67-link.c"
    252337#endif
    253338#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
    254366
    255367/* -------------------------------------------- */
     
    259371#define VSTACK_SIZE         256
    260372#define STRING_MAX_SIZE     1024
     373#define TOKSTR_MAX_SIZE     256
    261374#define PACK_STACK_SIZE     8
    262375
    263 #define TOK_HASH_SIZE       8192 /* must be a power of two */
     376#define TOK_HASH_SIZE       16384 /* must be a power of two */
    264377#define TOK_ALLOC_INCR      512  /* must be a power of two */
    265378#define TOK_MAX_SIZE        4 /* token max size in int unit when stored in string */
     
    287400    void *data; /* either 'char *' or 'nwchar_t *' */
    288401    int size_allocated;
    289     void *data_allocated; /* if non NULL, data has been malloced */
    290402} CString;
    291403
     
    301413    double d;
    302414    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;
    310420    int tab[LDOUBLE_SIZE/4];
    311421} CValue;
     
    318428                              type. If not used, set to VT_CONST */
    319429    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. */
    321432} SValue;
     433
     434/* symbol attributes */
     435struct 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 */
     447struct 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 */
     455typedef 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;
    322463
    323464/* symbol management */
    324465typedef struct Sym {
    325     int v;    /* symbol token */
    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 */
    328469    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 */
    331481    };
    332     CType type;    /* associated type */
     482    CType type; /* associated type */
    333483    union {
    334         struct Sym *next; /* next related symbol */
    335         long jnext; /* next jump label */
     484        struct Sym *next; /* next related symbol (for fields and anoms) */
     485        int asm_label; /* associated asm label */
    336486    };
    337487    struct Sym *prev; /* prev symbol in stack */
     
    340490
    341491/* section definition */
    342 /* XXX: use directly ELF structure for parameters ? */
    343 /* special flag to indicate that the section should not be linked to
    344    the other ones */
    345 #define SHF_PRIVATE 0x80000000
    346 
    347 /* special flag, too */
    348 #define SECTION_ABS ((void *)1)
    349 
    350492typedef struct Section {
    351493    unsigned long data_offset; /* current data offset */
     
    365507    struct Section *link;    /* link to another section */
    366508    struct Section *reloc;   /* corresponding section for relocation, if any */
    367     struct Section *hash;     /* hash table for symbols */
    368     struct Section *next;
     509    struct Section *hash;    /* hash table for symbols */
     510    struct Section *prev;    /* previous section on section stack */
    369511    char name[1];           /* section name */
    370512} Section;
     
    376518} DLLReference;
    377519
    378 /* GNUC attribute definition */
    379 typedef struct AttributeDef {
    380     unsigned
    381       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 
    404520/* -------------------------------------------------- */
    405521
     
    408524#define SYM_FIRST_ANOM 0x10000000 /* first anonymous sym */
    409525
    410 /* stored in 'Sym.c' field */
     526/* stored in 'Sym->f.func_type' field */
    411527#define FUNC_NEW       1 /* ansi function prototype */
    412528#define FUNC_OLD       2 /* old function prototype */
    413529#define FUNC_ELLIPSIS  3 /* ansi function prototype with ... */
    414530
    415 /* stored in 'Sym.r' field */
     531/* stored in 'Sym->f.func_call' field */
    416532#define FUNC_CDECL     0 /* standard c call */
    417533#define FUNC_STDCALL   1 /* pascal c call */
     
    442558    struct BufferedFile *prev;
    443559    int line_num;    /* current line number - here to simplify code */
     560    int line_ref;    /* tcc -E: last printed line */
    444561    int ifndef_macro;  /* #ifndef macro / #endif search */
    445562    int ifndef_macro_saved; /* saved ifndef_macro */
    446563    int *ifdef_stack_ptr; /* ifdef_stack value at the start of the file */
     564    int include_next_index; /* next search path */
    447565    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 */
    449569} BufferedFile;
    450570
    451571#define CH_EOB   '\\'       /* end of buffer or '\0' char in file */
    452572#define CH_EOF   (-1)   /* end of file */
    453 
    454 /* parsing state (used to save parser state to reparse part of the
    455    source several times) */
    456 typedef struct ParseState {
    457     const int *macro_ptr;
    458     int line_num;
    459     int tok;
    460     CValue tokc;
    461 } ParseState;
    462573
    463574/* used to record tokens */
     
    465576    int *str;
    466577    int len;
     578    int lastlen;
    467579    int allocated_len;
    468580    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;
    469586} TokenString;
    470587
    471588/* inline functions */
    472589typedef struct InlineFunc {
    473     int *token_str;
     590    TokenString *func_str;
    474591    Sym *sym;
    475592    char filename[1];
     
    480597typedef struct CachedInclude {
    481598    int ifndef_macro;
     599    int once;
    482600    int hash_next; /* -1 if none */
    483601    char filename[1]; /* path specified in #include */
    484602} CachedInclude;
    485603
    486 #define CACHED_INCLUDES_HASH_SIZE 512
     604#define CACHED_INCLUDES_HASH_SIZE 32
    487605
    488606#ifdef CONFIG_TCC_ASM
    489607typedef struct ExprValue {
    490     uint32_t v;
     608    uint64_t v;
    491609    Sym *sym;
     610    int pcrel;
    492611} ExprValue;
    493612
    494613#define MAX_ASM_OPERANDS 30
    495614typedef struct ASMOperand {
    496     int id; /* GCC 3 optionnal identifier (0 if number only supported */
     615    int id; /* GCC 3 optional identifier (0 if number only supported */
    497616    char *constraint;
    498617    char asm_str[16]; /* computed asm string for operand */
     
    508627#endif
    509628
     629/* extra symbol attributes (not in symbol table) */
    510630struct sym_attr {
    511     unsigned long got_offset;
     631    unsigned got_offset;
     632    unsigned plt_offset;
     633    int plt_sym;
     634    int dyn_index;
    512635#ifdef TCC_TARGET_ARM
    513636    unsigned char plt_thumb_stub:1;
     
    529652    char *soname; /* as specified on the command line (-soname) */
    530653    char *rpath; /* as specified on the command line (-Wl,-rpath=) */
     654    int enable_new_dtags; /* ditto, (-Wl,--enable-new-dtags) */
    531655
    532656    /* output type, see TCC_OUTPUT_XXX */
     
    538662    int char_is_unsigned;
    539663    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
    541668    /* warning switches */
    542669    int warn_write_strings;
     
    545672    int warn_none;
    546673    int warn_implicit_function_declaration;
     674    int warn_gcc_compat;
    547675
    548676    /* compile with debug symbol (and use them if error during execution) */
     
    552680    int do_bounds_check;
    553681#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 */
    554686
    555687    addr_t text_addr; /* address of text section */
    556688    int has_text_addr;
    557689
    558     unsigned long section_align; /* section alignment */
     690    unsigned section_align; /* section alignment */
    559691
    560692    char *init_symbol; /* symbols to call at load-time (not used currently) */
    561693    char *fini_symbol; /* symbols to call at unload-time (not used currently) */
    562    
     694
    563695#ifdef TCC_TARGET_I386
    564696    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. */
    565700#endif
    566701
     
    583718    char **crt_paths;
    584719    int nb_crt_paths;
     720
     721    /* -include files */
     722    char **cmd_include_files;
     723    int nb_cmd_include_files;
    585724
    586725    /* error handling */
     
    593732    /* output file for preprocessing (-E) */
    594733    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 */
    595741
    596742    /* for -MD/-MF: collected dependencies for this compilation */
     
    613759    int pack_stack[PACK_STACK_SIZE];
    614760    int *pack_stack_ptr;
     761    char **pragma_libs;
     762    int nb_pragma_libs;
    615763
    616764    /* inline functions are stored as token lists and compiled last
     
    629777    Section *got;
    630778    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;
    635779
    636780    /* temporary dynamic symbol sections (for dll loading) */
     
    638782    /* exported dynamic symbol section */
    639783    Section *dynsym;
    640     /* copy of the gobal symtab_section variable */
     784    /* copy of the global symtab_section variable */
    641785    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;
    644789
    645790#ifdef TCC_TARGET_PE
    646791    /* PE info */
    647792    int pe_subsystem;
     793    unsigned pe_characteristics;
    648794    unsigned pe_file_align;
    649795    unsigned pe_stack_size;
     796    addr_t pe_imagebase;
    650797# ifdef TCC_TARGET_X86_64
    651798    Section *uw_pdata;
     
    656803
    657804#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;
    670808#endif
    671809
    672810    /* 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 */
    674812    int nb_files; /* number thereof */
    675813    int nb_libraries; /* number of libs thereof */
     814    int filetype;
    676815    char *outfile; /* output filename */
    677     char *option_m; /* only -m32/-m64 handled */
    678     int print_search_dirs; /* option */
    679816    int option_r; /* option -r */
    680817    int do_bench; /* option -bench */
    681818    int gen_deps; /* option -MD  */
    682819    char *deps_outfile; /* option -MF */
     820    int option_pthread; /* -pthread option */
     821    int argc;
     822    char **argv;
     823};
     824
     825struct filespec {
     826    char type;
     827    char alacarte;
     828    char name[1];
    683829};
    684830
     
    691837#define VT_JMP       0x0034  /* value is the consequence of jmp true (even) */
    692838#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 */
    694839#define VT_LVAL      0x0100  /* var is an lvalue */
    695840#define VT_SYM       0x0200  /* a symbol value is added */
     
    707852/* types */
    708853#define VT_BTYPE       0x000f  /* mask for basic type */
    709 #define VT_INT              0  /* integer type */
     854#define VT_VOID             0  /* void type */
    710855#define VT_BYTE             1  /* signed byte type */
    711856#define VT_SHORT            2  /* short type */
    712 #define VT_VOID             3  /* void type */
    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 */
    715860#define VT_FUNC             6  /* function type */
    716861#define VT_STRUCT           7  /* struct/union definition */
     
    719864#define VT_LDOUBLE         10  /* IEEE long double */
    720865#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, only
    723                                   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
    724869#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) */
    731877
    732878/* 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)
    742897
    743898/* 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)
    746905
    747906/* token values */
     
    763922#define TOK_LAND  0xa0
    764923#define TOK_LOR   0xa1
    765 
    766924#define TOK_DEC   0xa2
    767925#define TOK_MID   0xa3 /* inc/dec, to void constant */
     
    770928#define TOK_UMOD  0xb1 /* unsigned modulo */
    771929#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
    782949#define TOK_UMULL    0xc2 /* unsigned 32x32 -> 64 mul */
    783950#define TOK_ADDC1    0xc3 /* add with carry generation */
     
    785952#define TOK_SUBC1    0xc5 /* add with carry generation */
    786953#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 */
    795963
    796964#define TOK_SHL   0x01 /* shift left */
    797965#define TOK_SAR   0x02 /* signed shift right */
    798  
    799 /* assignement operators : normal operator or 0x80 */
     966
     967/* assignment operators : normal operator or 0x80 */
    800968#define TOK_A_MOD 0xa5
    801969#define TOK_A_AND 0xa6
     
    809977#define TOK_A_SAR 0x82
    810978
    811 #ifndef offsetof
    812 #define offsetof(type, field) ((size_t) &((type *)0)->field)
    813 #endif
    814 
    815 #ifndef countof
    816 #define countof(tab) (sizeof(tab) / sizeof((tab)[0]))
    817 #endif
    818 
    819979#define TOK_EOF       (-1)  /* end of file */
    820980#define TOK_LINEFEED  10    /* line feed */
    821981
    822 /* all identificators and strings have token above that */
     982/* all identifiers and strings have token above that */
    823983#define TOK_IDENT 256
    824984
    825985#define DEF_ASM(x) DEF(TOK_ASM_ ## x, #x)
    826986#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
    828990
    829991#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
     
    8721034 DEF_FP1(x)
    8731035
    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_64
     1036#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 */
    9071069
    9081070enum 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
    9111073#include "tcctok.h"
    9121074#undef DEF
    9131075};
    9141076
     1077/* keywords: tok >= TOK_IDENT && tok < TOK_UIDENT */
    9151078#define TOK_UIDENT TOK_DEFINE
    916 
    917 #if 0//def _WIN32
    918 #define snprintf _snprintf
    919 #define vsnprintf _vsnprintf
    920 #ifndef __GNUC__
    921   #define strtold (long double)strtod
    922   #define strtof (float)strtod
    923   #define strtoll _strtoi64
    924   #define strtoull _strtoui64
    925 #endif
    926 #else
    927 /* 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 #endif
    931 
    932 #ifdef _WIN32
    933 #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 stricmp
    936 #else
    937 #define IS_DIRSEP(c) (c == '/')
    938 #define IS_ABSPATH(p) IS_DIRSEP(p[0])
    939 #define PATHCMP strcmp
    940 #endif
    941 
    942 #ifdef TCC_TARGET_PE
    943 #define PATHSEP ';'
    944 #else
    945 #define PATHSEP ':'
    946 #endif
    947 
    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_FUNC
    975 # define PUB_FUNC
    976 #endif
    977 
    978 #ifdef ONE_SOURCE
    979 #define ST_INLN static inline
    980 #define ST_FUNC static
    981 #define ST_DATA static
    982 #else
    983 #define ST_INLN
    984 #define ST_FUNC
    985 #define ST_DATA extern
    986 #endif
    9871079
    9881080/* ------------ libtcc.c ------------ */
     
    9951087ST_DATA struct TCCState *tcc_state;
    9961088
    997 #ifdef MEM_DEBUG
    998 ST_DATA int mem_cur_size;
    999 ST_DATA int mem_max_size;
    1000 #endif
    1001 
    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 
    10061089/* 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);
     1090ST_FUNC char *pstrcpy(char *buf, int buf_size, const char *s);
     1091ST_FUNC char *pstrcat(char *buf, int buf_size, const char *s);
     1092ST_FUNC char *pstrncpy(char *out, const char *in, size_t num);
    10101093PUB_FUNC char *tcc_basename(const char *name);
    10111094PUB_FUNC char *tcc_fileextension (const char *name);
     1095
     1096#ifndef MEM_DEBUG
    10121097PUB_FUNC void tcc_free(void *ptr);
    10131098PUB_FUNC void *tcc_malloc(unsigned long size);
     
    10151100PUB_FUNC void *tcc_realloc(void *ptr, unsigned long size);
    10161101PUB_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__)
     1108PUB_FUNC void tcc_free_debug(void *ptr);
     1109PUB_FUNC void *tcc_malloc_debug(unsigned long size, const char *file, int line);
     1110PUB_FUNC void *tcc_mallocz_debug(unsigned long size, const char *file, int line);
     1111PUB_FUNC void *tcc_realloc_debug(void *ptr, unsigned long size, const char *file, int line);
     1112PUB_FUNC char *tcc_strdup_debug(const char *str, const char *file, int line);
     1113#endif
     1114
    10171115#define free(p) use_tcc_free(p)
    10181116#define malloc(s) use_tcc_malloc(s)
     
    10201118#undef strdup
    10211119#define strdup(s) use_tcc_strdup(s)
    1022 PUB_FUNC void tcc_memstats(void);
     1120PUB_FUNC void tcc_memcheck(void);
    10231121PUB_FUNC void tcc_error_noabort(const char *fmt, ...);
    1024 PUB_FUNC void tcc_error(const char *fmt, ...);
     1122PUB_FUNC NORETURN void tcc_error(const char *fmt, ...);
    10251123PUB_FUNC void tcc_warning(const char *fmt, ...);
    10261124
    10271125/* other utilities */
    1028 ST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data);
     1126ST_FUNC void dynarray_add(void *ptab, int *nb_ptr, void *data);
    10291127ST_FUNC void dynarray_reset(void *pp, int *n);
    1030 ST_FUNC void cstr_ccat(CString *cstr, int ch);
    1031 ST_FUNC void cstr_cat(CString *cstr, const char *str);
     1128ST_INLN void cstr_ccat(CString *cstr, int ch);
     1129ST_FUNC void cstr_cat(CString *cstr, const char *str, int len);
    10321130ST_FUNC void cstr_wccat(CString *cstr, int ch);
    10331131ST_FUNC void cstr_new(CString *cstr);
     
    10351133ST_FUNC void cstr_reset(CString *cstr);
    10361134
    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 
    10471135ST_INLN void sym_free(Sym *sym);
    1048 ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c);
     1136ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, int c);
    10491137ST_FUNC Sym *sym_find2(Sym *s, int v);
    10501138ST_FUNC Sym *sym_push(int v, CType *type, int r, int c);
    1051 ST_FUNC void sym_pop(Sym **ptop, Sym *b);
     1139ST_FUNC void sym_pop(Sym **ptop, Sym *b, int keep);
    10521140ST_INLN Sym *struct_find(int v);
    10531141ST_INLN Sym *sym_find(int v);
     
    10591147
    10601148ST_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
    10611166ST_FUNC int tcc_add_crt(TCCState *s, const char *filename);
    10621167ST_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);
     1168ST_FUNC void tcc_add_pragma_libs(TCCState *s1);
     1169PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f);
     1170PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time);
     1171PUB_FUNC int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind);
     1172#ifdef _WIN32
     1173ST_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
    10661185
    10671186/* ------------ tccpp.c ------------ */
     
    10911210                                        token. line feed is also
    10921211                                        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. */
    10941213#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
    10951221
    10961222ST_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);
     1223ST_FUNC const char *get_tok_str(int v, CValue *cv);
     1224ST_FUNC void begin_macro(TokenString *str, int alloc);
     1225ST_FUNC void end_macro(void);
     1226ST_FUNC int set_idnum(int c, int val);
    11001227ST_INLN void tok_str_new(TokenString *s);
    1101 ST_FUNC void tok_str_free(int *str);
     1228ST_FUNC TokenString *tok_str_alloc(void);
     1229ST_FUNC void tok_str_free(TokenString *s);
     1230ST_FUNC void tok_str_free_str(int *str);
    11021231ST_FUNC void tok_str_add(TokenString *s, int t);
    11031232ST_FUNC void tok_str_add_tok(TokenString *s);
     
    11081237ST_FUNC Sym *label_find(int v);
    11091238ST_FUNC Sym *label_push(Sym **ptop, int v, int flags);
    1110 ST_FUNC void label_pop(Sym **ptop, Sym *slast);
     1239ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep);
    11111240ST_FUNC void parse_define(void);
    11121241ST_FUNC void preprocess(int is_bof);
     
    11141243ST_FUNC void next(void);
    11151244ST_INLN void unget_tok(int last_tok);
    1116 ST_FUNC void preprocess_init(TCCState *s1);
    1117 ST_FUNC void preprocess_new(void);
     1245ST_FUNC void preprocess_start(TCCState *s1, int is_asm);
     1246ST_FUNC void preprocess_end(TCCState *s1);
     1247ST_FUNC void tccpp_new(TCCState *s);
     1248ST_FUNC void tccpp_delete(TCCState *s);
    11181249ST_FUNC int tcc_preprocess(TCCState *s1);
    11191250ST_FUNC void skip(int c);
    1120 ST_FUNC void expect(const char *msg);
     1251ST_FUNC NORETURN void expect(const char *msg);
     1252
     1253/* space excluding newline */
     1254static inline int is_space(int ch) {
     1255    return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r';
     1256}
     1257static inline int isid(int c) {
     1258    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';
     1259}
     1260static inline int isnum(int c) {
     1261    return c >= '0' && c <= '9';
     1262}
     1263static inline int isoct(int c) {
     1264    return c >= '0' && c <= '7';
     1265}
     1266static inline int toup(int c) {
     1267    return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;
     1268}
    11211269
    11221270/* ------------ 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_ASM
    1127 ST_DATA Section *last_text_section; /* to handle .previous asm directive */
    1128 #endif
    1129 #ifdef CONFIG_TCC_BCHECK
    1130 /* 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 #endif
    1134 /* symbol sections */
    1135 ST_DATA Section *symtab_section, *strtab_section;
    1136 /* debug sections */
    1137 ST_DATA Section *stab_section, *stabstr_section;
    11381271
    11391272#define SYM_POOL_NB (8192 / sizeof(Sym))
     
    11481281ST_DATA Sym *define_stack;
    11491282ST_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;
     1283ST_DATA SValue __vstack[1+/*to make bcheck happy*/ VSTACK_SIZE], *vtop, *pvtop;
    11511284#define vstack  (__vstack + 1)
    11521285ST_DATA int rsym, anon_sym, ind, loc;
     
    11561289ST_DATA int global_expr;  /* true if compound literals must be allocated globally (used during initializers parsing */
    11571290ST_DATA CType func_vt; /* current function return type (used by return instruction) */
     1291ST_DATA int func_var; /* true if current function is variadic */
    11581292ST_DATA int func_vc;
    11591293ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */
    1160 ST_DATA char *funcname;
     1294ST_DATA const char *funcname;
     1295ST_DATA int g_debug;
     1296
     1297ST_FUNC void tcc_debug_start(TCCState *s1);
     1298ST_FUNC void tcc_debug_end(TCCState *s1);
     1299ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym);
     1300ST_FUNC void tcc_debug_funcend(TCCState *s1, int size);
     1301ST_FUNC void tcc_debug_line(TCCState *s1);
     1302
     1303ST_FUNC int tccgen_compile(TCCState *s1);
     1304ST_FUNC void free_inline_functions(TCCState *s);
     1305ST_FUNC void check_vstack(void);
    11611306
    11621307ST_INLN int is_float(int t);
    11631308ST_FUNC int ieee_finite(double d);
    11641309ST_FUNC void test_lvalue(void);
    1165 ST_FUNC void swap(int *p, int *q);
    11661310ST_FUNC void vpushi(int v);
     1311ST_FUNC ElfSym *elfsym(Sym *);
     1312ST_FUNC void update_storage(Sym *sym);
    11671313ST_FUNC Sym *external_global_sym(int v, CType *type, int r);
    11681314ST_FUNC void vset(CType *type, int r, int v);
     
    11781324ST_FUNC void vpushv(SValue *v);
    11791325ST_FUNC void save_reg(int r);
     1326ST_FUNC void save_reg_upstack(int r, int n);
    11801327ST_FUNC int get_reg(int rc);
    11811328ST_FUNC void save_regs(int n);
     1329ST_FUNC void gaddrof(void);
    11821330ST_FUNC int gv(int rc);
    11831331ST_FUNC void gv2(int rc1, int rc2);
     
    11881336ST_FUNC void vstore(void);
    11891337ST_FUNC void inc(int post, int c);
     1338ST_FUNC void parse_mult_str (CString *astr, const char *msg);
    11901339ST_FUNC void parse_asm_str(CString *astr);
    11911340ST_FUNC int lvalue_type(int t);
     
    11961345ST_FUNC void gexpr(void);
    11971346ST_FUNC int expr_const(void);
    1198 ST_FUNC void gen_inline_functions(void);
    1199 ST_FUNC void decl(int l);
    12001347#if defined CONFIG_TCC_BCHECK || defined TCC_TARGET_C67
    12011348ST_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
     1351ST_FUNC int classify_x86_64_va_arg(CType *ty);
    12021352#endif
    12031353
     
    12181368} Stab_Sym;
    12191369
     1370ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */
     1371ST_DATA Section *common_section;
     1372ST_DATA Section *cur_text_section; /* current section where function code is generated */
     1373#ifdef CONFIG_TCC_ASM
     1374ST_DATA Section *last_text_section; /* to handle .previous asm directive */
     1375#endif
     1376#ifdef CONFIG_TCC_BCHECK
     1377/* bound check related sections */
     1378ST_DATA Section *bounds_section; /* contains global data bound description */
     1379ST_DATA Section *lbounds_section; /* contains local data bound description */
     1380ST_FUNC void tccelf_bounds_new(TCCState *s);
     1381#endif
     1382/* symbol sections */
     1383ST_DATA Section *symtab_section;
     1384/* debug sections */
     1385ST_DATA Section *stab_section, *stabstr_section;
     1386
     1387ST_FUNC void tccelf_new(TCCState *s);
     1388ST_FUNC void tccelf_delete(TCCState *s);
     1389ST_FUNC void tccelf_stab_new(TCCState *s);
     1390ST_FUNC void tccelf_begin_file(TCCState *s1);
     1391ST_FUNC void tccelf_end_file(TCCState *s1);
     1392
     1393ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags);
     1394ST_FUNC void section_realloc(Section *sec, unsigned long new_size);
     1395ST_FUNC size_t section_add(Section *sec, addr_t size, int align);
     1396ST_FUNC void *section_ptr_add(Section *sec, addr_t size);
     1397ST_FUNC void section_reserve(Section *sec, unsigned long size);
     1398ST_FUNC Section *find_section(TCCState *s1, const char *name);
    12201399ST_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
     1401ST_FUNC void put_extern_sym2(Sym *sym, int sh_num, addr_t value, unsigned long size, int can_add_underscore);
     1402ST_FUNC void put_extern_sym(Sym *sym, Section *section, addr_t value, unsigned long size);
     1403#if PTR_SIZE == 4
     1404ST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type);
     1405#endif
     1406ST_FUNC void greloca(Section *s, Sym *sym, unsigned long offset, int type, addr_t addend);
    12211407
    12221408ST_FUNC int put_elf_str(Section *s, const char *sym);
    12231409ST_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);
     1410ST_FUNC int set_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int shndx, const char *name);
    12251411ST_FUNC int find_elf_sym(Section *s, const char *name);
    12261412ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol);
     1413ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, addr_t addend);
    12271414
    12281415ST_FUNC void put_stabs(const char *str, int type, int other, int desc, unsigned long value);
     
    12311418ST_FUNC void put_stabd(int type, int other, int desc);
    12321419
    1233 ST_FUNC void relocate_common_syms(void);
    1234 ST_FUNC void relocate_syms(TCCState *s1, int do_resolve);
     1420ST_FUNC void resolve_common_syms(TCCState *s1);
     1421ST_FUNC void relocate_syms(TCCState *s1, Section *symtab, int do_resolve);
    12351422ST_FUNC void relocate_section(TCCState *s1, Section *s);
    12361423
    1237 ST_FUNC void tcc_add_linker_symbols(TCCState *s1);
     1424ST_FUNC int tcc_object_type(int fd, ElfW(Ehdr) *h);
    12381425ST_FUNC int tcc_load_object_file(TCCState *s1, int fd, unsigned long file_offset);
    12391426ST_FUNC int tcc_load_archive(TCCState *s1, int fd);
    12401427ST_FUNC void tcc_add_bcheck(TCCState *s1);
     1428ST_FUNC void tcc_add_runtime(TCCState *s1);
    12411429
    12421430ST_FUNC void build_got_entries(TCCState *s1);
    1243 ST_FUNC void tcc_add_runtime(TCCState *s1);
     1431ST_FUNC struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc);
     1432ST_FUNC void squeeze_multi_relocs(Section *sec, size_t oldrelocoffset);
    12441433
    12451434ST_FUNC addr_t get_elf_sym_addr(TCCState *s, const char *name, int err);
    1246 #ifdef TCC_IS_NATIVE
     1435#if defined TCC_IS_NATIVE || defined TCC_TARGET_PE
    12471436ST_FUNC void *tcc_get_symbol_err(TCCState *s, const char *name);
    12481437#endif
     
    12571446#endif
    12581447
     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 */
     1452enum 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
     1459ST_FUNC int code_reloc (int reloc_type);
     1460ST_FUNC int gotplt_entry_type (int reloc_type);
     1461ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr);
     1462ST_FUNC void relocate_init(Section *sr);
     1463ST_FUNC void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val);
     1464ST_FUNC void relocate_plt(TCCState *s1);
     1465
    12591466/* ------------ xxx-gen.c ------------ */
    12601467
    1261 #ifdef TCC_TARGET_X86_64
    1262 ST_DATA const int reg_classes[NB_REGS+7];
    1263 #else
    12641468ST_DATA const int reg_classes[NB_REGS];
    1265 #endif
    12661469
    12671470ST_FUNC void gsym_addr(int t, int a);
     
    12691472ST_FUNC void load(int r, SValue *sv);
    12701473ST_FUNC void store(int r, SValue *v);
     1474ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *align, int *regsize);
    12711475ST_FUNC void gfunc_call(int nb_args);
    12721476ST_FUNC void gfunc_prolog(CType *func_type);
     
    12751479ST_FUNC void gjmp_addr(int a);
    12761480ST_FUNC int gtst(int inv, int t);
     1481#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
     1482ST_FUNC void gtst_addr(int inv, int a);
     1483#else
     1484#define gtst_addr(inv, a) gsym_addr(gtst(inv, 0), a)
     1485#endif
    12771486ST_FUNC void gen_opi(int op);
    12781487ST_FUNC void gen_opf(int op);
     
    12861495ST_FUNC void gen_cvt_itof(int t);
    12871496#endif
     1497ST_FUNC void gen_vla_sp_save(int addr);
     1498ST_FUNC void gen_vla_sp_restore(int addr);
     1499ST_FUNC void gen_vla_alloc(CType *type, int align);
     1500
     1501static inline uint16_t read16le(unsigned char *p) {
     1502    return p[0] | (uint16_t)p[1] << 8;
     1503}
     1504static inline void write16le(unsigned char *p, uint16_t x) {
     1505    p[0] = x & 255;  p[1] = x >> 8 & 255;
     1506}
     1507static inline uint32_t read32le(unsigned char *p) {
     1508  return read16le(p) | (uint32_t)read16le(p + 2) << 16;
     1509}
     1510static inline void write32le(unsigned char *p, uint32_t x) {
     1511    write16le(p, x);  write16le(p + 2, x >> 16);
     1512}
     1513static inline void add32le(unsigned char *p, int32_t x) {
     1514    write32le(p, read32le(p) + x);
     1515}
     1516static inline uint64_t read64le(unsigned char *p) {
     1517  return read32le(p) | (uint64_t)read32le(p + 4) << 32;
     1518}
     1519static inline void write64le(unsigned char *p, uint64_t x) {
     1520    write32le(p, x);  write32le(p + 4, x >> 32);
     1521}
     1522static inline void add64le(unsigned char *p, int64_t x) {
     1523    write64le(p, read64le(p) + x);
     1524}
    12881525
    12891526/* ------------ i386-gen.c ------------ */
    12901527#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
    12911528ST_FUNC void g(int c);
    1292 ST_FUNC int oad(int c, int s);
    12931529ST_FUNC void gen_le16(int c);
    12941530ST_FUNC void gen_le32(int c);
     
    13061542ST_FUNC void gen_addr64(int r, Sym *sym, int64_t c);
    13071543ST_FUNC void gen_opl(int op);
     1544#ifdef TCC_TARGET_PE
     1545ST_FUNC void gen_vla_result(int addr);
     1546#endif
    13081547#endif
    13091548
    13101549/* ------------ arm-gen.c ------------ */
    13111550#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)
     1552PUB_FUNC const char *default_elfinterp(struct TCCState *s);
     1553#endif
     1554ST_FUNC void arm_init(struct TCCState *s);
    13141555ST_FUNC void gen_cvt_itof1(int t);
     1556#endif
     1557
     1558/* ------------ arm64-gen.c ------------ */
     1559#ifdef TCC_TARGET_ARM64
     1560ST_FUNC void gen_cvt_sxtw(void);
     1561ST_FUNC void gen_opl(int op);
     1562ST_FUNC void gfunc_return(CType *func_type);
     1563ST_FUNC void gen_va_start(void);
     1564ST_FUNC void gen_va_arg(CType *t);
     1565ST_FUNC void gen_clear_cache(void);
    13151566#endif
    13161567
     
    13311582#ifdef CONFIG_TCC_ASM
    13321583ST_FUNC int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp);
     1584ST_FUNC Sym* get_asm_sym(int name, Sym *csym);
    13331585ST_FUNC void asm_expr(TCCState *s1, ExprValue *pe);
    13341586ST_FUNC int asm_int_expr(TCCState *s1);
     
    13361588/* ------------ i386-asm.c ------------ */
    13371589ST_FUNC void gen_expr32(ExprValue *pe);
     1590#ifdef TCC_TARGET_X86_64
     1591ST_FUNC void gen_expr64(ExprValue *pe);
     1592#endif
    13381593ST_FUNC void asm_opcode(TCCState *s1, int opcode);
     1594ST_FUNC int asm_parse_regvar(int t);
    13391595ST_FUNC void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg);
    13401596ST_FUNC void subst_asm_operand(CString *add_str, SValue *sv, int modifier);
     
    13481604ST_FUNC int pe_output_file(TCCState * s1, const char *filename);
    13491605ST_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
    13501607ST_FUNC SValue *pe_getimport(SValue *sv, SValue *v2);
     1608#endif
    13511609#ifdef TCC_TARGET_X86_64
    13521610ST_FUNC void pe_add_unwind_data(unsigned start, unsigned end, unsigned stack);
    13531611#endif
    1354 #endif
     1612PUB_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
    13551619
    13561620/* ------------ tccrun.c ----------------- */
     
    13651629ST_FUNC void dlclose(void *p);
    13661630ST_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 
     1631ST_FUNC void *dlsym(void *handle, const char *symbol);
     1632#endif
    13721633#ifdef CONFIG_TCC_BACKTRACE
    13731634ST_DATA int rt_num_callers;
     
    13761637ST_FUNC void tcc_set_num_callers(int n);
    13771638#endif
     1639ST_FUNC void tcc_run_free(TCCState *s1);
     1640#endif
     1641
     1642/* ------------ tcctools.c ----------------- */
     1643#if 0 /* included in tcc.c */
     1644ST_FUNC int tcc_tool_ar(TCCState *s, int argc, char **argv);
     1645#ifdef TCC_TARGET_PE
     1646ST_FUNC int tcc_tool_impdef(TCCState *s, int argc, char **argv);
     1647#endif
     1648ST_FUNC void tcc_tool_cross(TCCState *s, char **argv, int option);
     1649ST_FUNC void gen_makedeps(TCCState *s, const char *target, const char *filename);
    13781650#endif
    13791651
    13801652/********************************************************/
    13811653#undef ST_DATA
    1382 #ifdef ONE_SOURCE
     1654#if ONE_SOURCE
    13831655#define ST_DATA static
    13841656#else
Note: See TracChangeset for help on using the changeset viewer.