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:
6 added
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/Makefile

    r279 r331  
    55TOP = ..
    66include $(TOP)/Makefile
    7 VPATH = $(top_srcdir)/lib $(top_srcdir)/win32/lib
     7VPATH = $(TOPSRC)/lib $(TOPSRC)/win32/lib
     8T = $(or $(CROSS_TARGET),$(NATIVE_TARGET),unknown)
     9X = $(if $(CROSS_TARGET),$(CROSS_TARGET)-)
     10BIN = $(TOP)/$(X)libtcc1.a
    811
    9 ifndef TARGET
    10  ifdef CONFIG_WIN64
    11   TARGET = x86_64-win32
    12  else
    13  ifdef CONFIG_WIN32
    14   TARGET = i386-win32
    15  else
    16  ifeq ($(ARCH),i386)
    17   TARGET = i386
    18   ifneq ($(TARGETOS),Darwin)
    19    XCC = $(CC)
    20   endif
    21  else
    22  ifeq ($(ARCH),x86-64)
    23   TARGET = x86_64
    24   ifneq ($(TARGETOS),Darwin)
    25    XCC = $(CC)
    26   endif
    27  endif
    28  endif
    29  endif
    30  endif
    31  BCHECK_O = bcheck.o
     12XTCC ?= $(TOP)/$(X)tcc$(EXESUF)
     13XCC = $(XTCC)
     14XAR = $(XTCC) -ar
     15XFLAGS-unx = -B$(TOPSRC)
     16XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include
     17XFLAGS = $(XFLAGS$(XCFG))
     18XCFG = $(or $(findstring -win,$T),-unx)
     19
     20# in order to use gcc, tyoe: make <target>-libtcc1-usegcc=yes
     21arm-libtcc1-usegcc ?= no
     22
     23ifeq "$($(T)-libtcc1-usegcc)" "yes"
     24 XCC = $(CC)
     25 XAR = $(AR)
     26 XFLAGS = $(CFLAGS) -fPIC
    3227endif
    3328
    34 DIR = $(TARGET)
     29# only for native compiler
     30$(X)BCHECK_O = bcheck.o
    3531
    36 native : ../libtcc1.a
    37 cross : $(DIR)/libtcc1.a
    38 
    39 native : TCC = $(TOP)/tcc$(EXESUF)
    40 cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF)
    41 
    42 I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O)
    43 X86_64_O = libtcc1.o alloca86_64.o
    44 WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o
    45 WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o
    46 
    47 ifeq "$(TARGET)" "i386-win32"
    48  OBJ = $(addprefix $(DIR)/,$(WIN32_O))
    49  TGT = -DTCC_TARGET_I386 -DTCC_TARGET_PE
    50  XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include
    51  XAR = $(DIR)/tiny_libmaker$(EXESUF)
    52 else
    53 ifeq "$(TARGET)" "x86_64-win32"
    54  OBJ = $(addprefix $(DIR)/,$(WIN64_O))
    55  TGT = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE
    56  XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include
    57  XAR = $(DIR)/tiny_libmaker$(EXESUF)
    58 else
    59 ifeq "$(TARGET)" "i386"
    60  OBJ = $(addprefix $(DIR)/,$(I386_O))
    61  TGT = -DTCC_TARGET_I386
    62  XCC ?= $(TCC) -B$(TOP)
    63 else
    64 ifeq "$(TARGET)" "x86_64"
    65  OBJ = $(addprefix $(DIR)/,$(X86_64_O))
    66  TGT = -DTCC_TARGET_X86_64
    67  XCC ?= $(TCC) -B$(TOP)
    68 else
    69  $(error libtcc1.a not supported on target '$(TARGET)')
    70 endif
    71 endif
    72 endif
    73 endif
    74 
    75 XFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT)
    76 
    77 ifeq ($(TARGETOS),Darwin)
    78  XAR = $(DIR)/tiny_libmaker$(EXESUF)
    79  XFLAGS += -D_ANSI_SOURCE
     32ifeq ($(CONFIG_musl)$(CONFIG_uClibc),yes)
    8033 BCHECK_O =
    8134endif
    8235
    83 ifdef XAR
    84 AR = $(XAR)
     36ifdef CONFIG_OSX
     37 XFLAGS += -D_ANSI_SOURCE
    8538endif
    8639
    87 $(DIR)/libtcc1.a ../libtcc1.a : $(OBJ) $(XAR)
    88         $(AR) rcs $@ $(OBJ)
    89 $(DIR)/%.o : %.c
     40I386_O = libtcc1.o alloca86.o alloca86-bt.o
     41X86_64_O = libtcc1.o alloca86_64.o alloca86_64-bt.o
     42ARM_O = libtcc1.o armeabi.o alloca-arm.o armflush.o
     43ARM64_O = lib-arm64.o
     44WIN_O = crt1.o crt1w.o wincrt1.o wincrt1w.o dllcrt1.o dllmain.o
     45
     46OBJ-i386 = $(I386_O) $(BCHECK_O)
     47OBJ-x86_64 = $(X86_64_O) va_list.o $(BCHECK_O)
     48OBJ-x86_64-osx = $(X86_64_O) va_list.o
     49OBJ-i386-win32 = $(I386_O) chkstk.o bcheck.o $(WIN_O)
     50OBJ-x86_64-win32 = $(X86_64_O) chkstk.o bcheck.o $(WIN_O)
     51OBJ-arm64 = $(ARM64_O)
     52OBJ-arm = $(ARM_O)
     53OBJ-arm-fpa = $(ARM_O)
     54OBJ-arm-fpa-ld = $(ARM_O)
     55OBJ-arm-vfp = $(ARM_O)
     56OBJ-arm-eabi = $(ARM_O)
     57OBJ-arm-eabihf = $(ARM_O)
     58OBJ-arm-wince = $(ARM_O) $(WIN_O)
     59
     60$(BIN) : $(patsubst %.o,$(X)%.o,$(OBJ-$T))
     61        $(XAR) rcs $@ $^
     62
     63$(X)%.o : %.c
    9064        $(XCC) -c $< -o $@ $(XFLAGS)
    91 $(DIR)/%.o : %.S
     65
     66$(X)%.o : %.S
    9267        $(XCC) -c $< -o $@ $(XFLAGS)
    93 $(DIR)/%$(EXESUF) : $(TOP)/win32/tools/%.c
    94         $(CC) -o $@ $< $(XFLAGS) $(LDFLAGS)
    9568
    96 $(OBJ) $(XAR) : $(DIR)/exists
    97 $(DIR)/exists :
    98         mkdir -p $(DIR)
    99         @echo $@ > $@
     69$(X)crt1w.o : crt1.c
     70$(X)wincrt1w.o : wincrt1.c
    10071
    10172clean :
    102         rm -rfv i386-win32 x86_64-win32 i386 x86_64
     73        rm -f *.a *.o $(BIN)
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/alloca86-bt.S

    • Property svn:keywords deleted
    r279 r331  
    1212    jz      p6
    1313
    14 #ifdef TCC_TARGET_PE
     14#ifdef _WIN32
    1515p4:
    1616    cmp     $4096,%eax
    17     jle     p5
     17    jbe     p5
     18    test    %eax,-4096(%esp)
    1819    sub     $4096,%esp
    1920    sub     $4096,%eax
    20     test    %eax,(%esp)
    2121    jmp p4
    2222
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/alloca86.S

    • Property svn:keywords deleted
    r279 r331  
    1111    jz      p3
    1212
    13 #ifdef TCC_TARGET_PE
     13#ifdef _WIN32
    1414p1:
    1515    cmp     $4096,%eax
    16     jle     p2
     16    jbe     p2
     17    test    %eax,-4096(%esp)
    1718    sub     $4096,%esp
    1819    sub     $4096,%eax
    19     test    %eax,(%esp)
    2020    jmp p1
    2121p2:
     
    2929    ret
    3030
    31 /* mark stack as nonexecutable */
    32 #if defined __ELF__ && defined __linux__
    33     .section    .note.GNU-stack,"",@progbits
    34 #endif
    3531/* ---------------------------------------------- */
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/alloca86_64.S

    • Property svn:keywords deleted
    r279 r331  
    66alloca:
    77    pop     %rdx
    8 #ifdef TCC_TARGET_PE
     8#ifdef _WIN32
    99    mov     %rcx,%rax
    1010#else
     
    1515    jz      p3
    1616
    17 #ifdef TCC_TARGET_PE
     17#ifdef _WIN32
    1818p1:
    1919    cmp     $4096,%rax
    20     jle     p2
     20    jbe     p2
     21    test    %rax,-4096(%rsp)
    2122    sub     $4096,%rsp
    2223    sub     $4096,%rax
    23     test    %rax,(%rsp)
    2424    jmp p1
    2525p2:
     
    2828    sub     %rax,%rsp
    2929    mov     %rsp,%rax
    30 #ifdef TCC_TARGET_PE
    31     add     $32,%rax
    32 #endif
    33 
    3430p3:
    3531    push    %rdx
    3632    ret
    3733
    38 /* mark stack as nonexecutable */
    39 #if defined __ELF__ && defined __linux__
    40     .section    .note.GNU-stack,"",@progbits
    41 #endif
    4234/* ---------------------------------------------- */
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/bcheck.c

    r321 r331  
    2222#include <stdarg.h>
    2323#include <string.h>
    24 #if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) \
    25     && !defined(__DragonFly__) && !defined(__OpenBSD__)
     24
     25#if !defined(__FreeBSD__) \
     26 && !defined(__FreeBSD_kernel__) \
     27 && !defined(__DragonFly__) \
     28 && !defined(__OpenBSD__) \
     29 && !defined(__NetBSD__)
    2630#include <malloc.h>
    2731#endif
     32
    2833#if !defined(_WIN32)
    2934#include <unistd.h>
    3035#endif
    3136
    32 //#define BOUND_DEBUG
     37/* #define BOUND_DEBUG */
     38
     39#ifdef BOUND_DEBUG
     40 #define dprintf(a...) fprintf(a)
     41#else
     42 #define dprintf(a...)
     43#endif
    3344
    3445/* define so that bound array is static (faster, but use memory if
    3546   bound checking not used) */
    36 //#define BOUND_STATIC
     47/* #define BOUND_STATIC */
    3748
    3849/* use malloc hooks. Currently the code cannot be reliable if no hooks */
     
    4051#define HAVE_MEMALIGN
    4152
    42 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
    43     || defined(__DragonFly__) || defined(__dietlibc__) \
    44     || defined(__UCLIBC__) || defined(__OpenBSD__) \
    45     || defined(_WIN32) || defined(TCC_UCLIBC)
    46 #warning Bound checking does not support malloc (etc.) in this environment.
     53#if defined(__FreeBSD__) \
     54 || defined(__FreeBSD_kernel__) \
     55 || defined(__DragonFly__) \
     56 || defined(__OpenBSD__) \
     57 || defined(__NetBSD__) \
     58 || defined(__dietlibc__) \
     59 || defined(_WIN32)
     60//#warning Bound checking does not support malloc (etc.) in this environment.
    4761#undef CONFIG_TCC_MALLOC_HOOKS
    4862#undef HAVE_MEMALIGN
     
    5165#define BOUND_T1_BITS 13
    5266#define BOUND_T2_BITS 11
    53 #define BOUND_T3_BITS (32 - BOUND_T1_BITS - BOUND_T2_BITS)
    54 
    55 #define BOUND_T1_SIZE (1 << BOUND_T1_BITS)
    56 #define BOUND_T2_SIZE (1 << BOUND_T2_BITS)
    57 #define BOUND_T3_SIZE (1 << BOUND_T3_BITS)
    58 #define BOUND_E_BITS  4
     67#define BOUND_T3_BITS (sizeof(size_t)*8 - BOUND_T1_BITS - BOUND_T2_BITS)
     68#define BOUND_E_BITS  (sizeof(size_t))
     69
     70#define BOUND_T1_SIZE ((size_t)1 << BOUND_T1_BITS)
     71#define BOUND_T2_SIZE ((size_t)1 << BOUND_T2_BITS)
     72#define BOUND_T3_SIZE ((size_t)1 << BOUND_T3_BITS)
    5973
    6074#define BOUND_T23_BITS (BOUND_T2_BITS + BOUND_T3_BITS)
    61 #define BOUND_T23_SIZE (1 << BOUND_T23_BITS)
     75#define BOUND_T23_SIZE ((size_t)1 << BOUND_T23_BITS)
    6276
    6377
     
    6579#define INVALID_POINTER ((void *)(-2))
    6680/* size of an empty region */
    67 #define EMPTY_SIZE        0xffffffff
     81#define EMPTY_SIZE  ((size_t)(-1))
    6882/* size of an invalid region */
    6983#define INVALID_SIZE      0
    7084
    7185typedef struct BoundEntry {
    72     unsigned long start;
    73     unsigned long size;
     86    size_t start;
     87    size_t size;
    7488    struct BoundEntry *next;
    75     unsigned long is_invalid; /* true if pointers outside region are invalid */
     89    size_t is_invalid; /* true if pointers outside region are invalid */
    7690} BoundEntry;
    7791
    7892/* external interface */
    7993void __bound_init(void);
    80 void __bound_new_region(void *p, unsigned long size);
     94void __bound_new_region(void *p, size_t size);
    8195int __bound_delete_region(void *p);
    8296
     97#ifdef __attribute__
     98  /* an __attribute__ macro is defined in the system headers */
     99  #undef __attribute__
     100#endif
    83101#define FASTCALL __attribute__((regparm(3)))
    84102
     
    105123
    106124/* runtime error output */
    107 extern void rt_error(unsigned long pc, const char *fmt, ...);
     125extern void rt_error(size_t pc, const char *fmt, ...);
    108126
    109127#ifdef BOUND_STATIC
     
    117135static BoundEntry *__bound_find_region(BoundEntry *e1, void *p)
    118136{
    119     unsigned long addr, tmp;
     137    size_t addr, tmp;
    120138    BoundEntry *e;
    121139
    122140    e = e1;
    123141    while (e != NULL) {
    124         addr = (unsigned long)p;
     142        addr = (size_t)p;
    125143        addr -= e->start;
    126144        if (addr <= e->size) {
     
    147165{
    148166    __bound_error_msg = fmt;
    149     *(int *)0 = 0; /* force a runtime error */
     167    fprintf(stderr,"%s %s: %s\n", __FILE__, __FUNCTION__, fmt);
     168    *(void **)0 = 0; /* force a runtime error */
    150169}
    151170
     
    157176/* return '(p + offset)' for pointer arithmetic (a pointer can reach
    158177   the end of a region in this case */
    159 void * FASTCALL __bound_ptr_add(void *p, int offset)
    160 {
    161     unsigned long addr = (unsigned long)p;
     178void * FASTCALL __bound_ptr_add(void *p, size_t offset)
     179{
     180    size_t addr = (size_t)p;
    162181    BoundEntry *e;
    163 #if defined(BOUND_DEBUG)
    164     printf("add: 0x%x %d\n", (int)p, offset);
    165 #endif
     182
     183    dprintf(stderr, "%s %s: %p %x\n",
     184        __FILE__, __FUNCTION__, p, (unsigned)offset);
     185
     186    __bound_init();
    166187
    167188    e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];
     
    172193    if (addr > e->size) {
    173194        e = __bound_find_region(e, p);
    174         addr = (unsigned long)p - e->start;
     195        addr = (size_t)p - e->start;
    175196    }
    176197    addr += offset;
    177     if (addr > e->size)
     198    if (addr >= e->size) {
     199        fprintf(stderr,"%s %s: %p is outside of the region\n",
     200            __FILE__, __FUNCTION__, p + offset);
    178201        return INVALID_POINTER; /* return an invalid pointer */
     202    }
    179203    return p + offset;
    180204}
     
    183207   be strictly inside the region */
    184208#define BOUND_PTR_INDIR(dsize)                                          \
    185 void * FASTCALL __bound_ptr_indir ## dsize (void *p, int offset)        \
     209void * FASTCALL __bound_ptr_indir ## dsize (void *p, size_t offset)     \
    186210{                                                                       \
    187     unsigned long addr = (unsigned long)p;                              \
     211    size_t addr = (size_t)p;                                            \
    188212    BoundEntry *e;                                                      \
    189213                                                                        \
     214    dprintf(stderr, "%s %s: %p %x start\n",                             \
     215        __FILE__, __FUNCTION__, p, (unsigned)offset);                   \
     216                                                                        \
     217    __bound_init();                                                     \
    190218    e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];            \
    191219    e = (BoundEntry *)((char *)e +                                      \
     
    195223    if (addr > e->size) {                                               \
    196224        e = __bound_find_region(e, p);                                  \
    197         addr = (unsigned long)p - e->start;                             \
     225        addr = (size_t)p - e->start;                                    \
    198226    }                                                                   \
    199227    addr += offset + dsize;                                             \
    200     if (addr > e->size)                                                 \
     228    if (addr > e->size) {                                               \
     229        fprintf(stderr,"%s %s: %p is outside of the region\n",          \
     230            __FILE__, __FUNCTION__, p + offset);                        \
    201231        return INVALID_POINTER; /* return an invalid pointer */         \
     232    }                                                                   \
     233    dprintf(stderr, "%s %s: return p+offset = %p\n",                    \
     234        __FILE__, __FUNCTION__, p + offset);                            \
    202235    return p + offset;                                                  \
    203236}
     
    210243BOUND_PTR_INDIR(16)
    211244
     245#if defined(__GNUC__) && (__GNUC__ >= 6)
     246/*
     247 * At least gcc 6.2 complains when __builtin_frame_address is used with
     248 * nonzero argument.
     249 */
     250#pragma GCC diagnostic push
     251#pragma GCC diagnostic ignored "-Wframe-address"
     252#endif
     253
    212254/* return the frame pointer of the caller */
    213255#define GET_CALLER_FP(fp)\
    214256{\
    215     fp = (unsigned long)__builtin_frame_address(1);\
     257    fp = (size_t)__builtin_frame_address(1);\
    216258}
    217259
     
    219261void FASTCALL __bound_local_new(void *p1)
    220262{
    221     unsigned long addr, size, fp, *p = p1;
     263    size_t addr, size, fp, *p = p1;
     264
     265    dprintf(stderr, "%s, %s start p1=%p\n", __FILE__, __FUNCTION__, p);
    222266    GET_CALLER_FP(fp);
    223267    for(;;) {
     
    230274        __bound_new_region((void *)addr, size);
    231275    }
     276    dprintf(stderr, "%s, %s end\n", __FILE__, __FUNCTION__);
    232277}
    233278
     
    235280void FASTCALL __bound_local_delete(void *p1)
    236281{
    237     unsigned long addr, fp, *p = p1;
     282    size_t addr, fp, *p = p1;
    238283    GET_CALLER_FP(fp);
    239284    for(;;) {
     
    247292}
    248293
     294#if defined(__GNUC__) && (__GNUC__ >= 6)
     295#pragma GCC diagnostic pop
     296#endif
     297
    249298static BoundEntry *__bound_new_page(void)
    250299{
    251300    BoundEntry *page;
    252     int i;
     301    size_t i;
    253302
    254303    page = libc_malloc(sizeof(BoundEntry) * BOUND_T2_SIZE);
     
    278327}
    279328
    280 static inline BoundEntry *get_page(int index)
     329static BoundEntry *get_page(size_t index)
    281330{
    282331    BoundEntry *page;
    283332    page = __bound_t1[index];
    284     if (page == __bound_empty_t2 || page == __bound_invalid_t2) {
     333    if (!page || page == __bound_empty_t2 || page == __bound_invalid_t2) {
    285334        /* create a new page if necessary */
    286335        page = __bound_new_page();
     
    291340
    292341/* mark a region as being invalid (can only be used during init) */
    293 static void mark_invalid(unsigned long addr, unsigned long size)
    294 {
    295     unsigned long start, end;
     342static void mark_invalid(size_t addr, size_t size)
     343{
     344    size_t start, end;
    296345    BoundEntry *page;
    297     int t1_start, t1_end, i, j, t2_start, t2_end;
     346    size_t t1_start, t1_end, i, j, t2_start, t2_end;
    298347
    299348    start = addr;
     
    307356
    308357#if 0
    309     printf("mark_invalid: start = %x %x\n", t2_start, t2_end);
     358    dprintf(stderr, "mark_invalid: start = %x %x\n", t2_start, t2_end);
    310359#endif
    311360   
     
    346395void __bound_init(void)
    347396{
    348     int i;
     397    size_t i;
    349398    BoundEntry *page;
    350     unsigned long start, size;
    351     int *p;
     399    size_t start, size;
     400    size_t *p;
     401
     402    static int inited;
     403    if (inited)
     404        return;
     405
     406    inited = 1;
     407
     408    dprintf(stderr, "%s, %s() start\n", __FILE__, __FUNCTION__);
    352409
    353410    /* save malloc hooks and install bound check hooks */
     
    375432
    376433    /* invalid pointer zone */
    377     start = (unsigned long)INVALID_POINTER & ~(BOUND_T23_SIZE - 1);
     434    start = (size_t)INVALID_POINTER & ~(BOUND_T23_SIZE - 1);
    378435    size = BOUND_T23_SIZE;
    379436    mark_invalid(start, size);
     
    406463     *     start_brk from /proc/self/stat
    407464     */
    408     start = (unsigned long)sbrk(0);
     465    start = (size_t)sbrk(0);
    409466    size = 128 * 0x100000;
    410467    mark_invalid(start, size);
     
    412469
    413470    /* add all static bound check values */
    414     p = (int *)&__bounds_start;
     471    p = (size_t *)&__bounds_start;
    415472    while (p[0] != 0) {
    416473        __bound_new_region((void *)p[0], p[1]);
    417474        p += 2;
    418475    }
     476
     477    dprintf(stderr, "%s, %s() end\n\n", __FILE__, __FUNCTION__);
     478}
     479
     480void __bound_main_arg(void **p)
     481{
     482    void *start = p;
     483    while (*p++);
     484
     485    dprintf(stderr, "%s, %s calling __bound_new_region(%p %x)\n",
     486            __FILE__, __FUNCTION__, start, (unsigned)((void *)p - start));
     487
     488    __bound_new_region(start, (void *) p - start);
    419489}
    420490
    421491void __bound_exit(void)
    422492{
     493    dprintf(stderr, "%s, %s()\n", __FILE__, __FUNCTION__);
    423494    restore_malloc_hooks();
    424495}
    425496
    426497static inline void add_region(BoundEntry *e,
    427                               unsigned long start, unsigned long size)
     498                              size_t start, size_t size)
    428499{
    429500    BoundEntry *e1;
     
    445516
    446517/* create a new region. It should not already exist in the region list */
    447 void __bound_new_region(void *p, unsigned long size)
    448 {
    449     unsigned long start, end;
     518void __bound_new_region(void *p, size_t size)
     519{
     520    size_t start, end;
    450521    BoundEntry *page, *e, *e2;
    451     int t1_start, t1_end, i, t2_start, t2_end;
    452 
    453     start = (unsigned long)p;
     522    size_t t1_start, t1_end, i, t2_start, t2_end;
     523
     524    dprintf(stderr, "%s, %s(%p, %x) start\n",
     525        __FILE__, __FUNCTION__, p, (unsigned)size);
     526
     527    __bound_init();
     528
     529    start = (size_t)p;
    454530    end = start + size;
    455531    t1_start = start >> (BOUND_T2_BITS + BOUND_T3_BITS);
     
    462538    t2_end = (end >> (BOUND_T3_BITS - BOUND_E_BITS)) &
    463539        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS);
    464 #ifdef BOUND_DEBUG
    465     printf("new %lx %lx %x %x %x %x\n",
    466            start, end, t1_start, t1_end, t2_start, t2_end);
    467 #endif
     540
    468541
    469542    e = (BoundEntry *)((char *)page + t2_start);
     
    507580        add_region(e, start, size);
    508581    }
     582
     583    dprintf(stderr, "%s, %s end\n", __FILE__, __FUNCTION__);
    509584}
    510585
    511586/* delete a region */
    512 static inline void delete_region(BoundEntry *e,
    513                                  void *p, unsigned long empty_size)
    514 {
    515     unsigned long addr;
     587static inline void delete_region(BoundEntry *e, void *p, size_t empty_size)
     588{
     589    size_t addr;
    516590    BoundEntry *e1;
    517591
    518     addr = (unsigned long)p;
     592    addr = (size_t)p;
    519593    addr -= e->start;
    520594    if (addr <= e->size) {
     
    540614            if (e == NULL)
    541615                break;
    542             addr = (unsigned long)p - e->start;
     616            addr = (size_t)p - e->start;
    543617            if (addr <= e->size) {
    544618                /* found: remove entry */
     
    555629int __bound_delete_region(void *p)
    556630{
    557     unsigned long start, end, addr, size, empty_size;
     631    size_t start, end, addr, size, empty_size;
    558632    BoundEntry *page, *e, *e2;
    559     int t1_start, t1_end, t2_start, t2_end, i;
    560 
    561     start = (unsigned long)p;
     633    size_t t1_start, t1_end, t2_start, t2_end, i;
     634
     635    dprintf(stderr, "%s %s() start\n", __FILE__, __FUNCTION__);
     636
     637    __bound_init();
     638
     639    start = (size_t)p;
    562640    t1_start = start >> (BOUND_T2_BITS + BOUND_T3_BITS);
    563641    t2_start = (start >> (BOUND_T3_BITS - BOUND_E_BITS)) &
     
    571649        e = __bound_find_region(e, p);
    572650    /* test if invalid region */
    573     if (e->size == EMPTY_SIZE || (unsigned long)p != e->start)
     651    if (e->size == EMPTY_SIZE || (size_t)p != e->start)
    574652        return -1;
    575653    /* compute the size we put in invalid regions */
     
    625703        delete_region(e, p, empty_size);
    626704    }
     705
     706    dprintf(stderr, "%s %s() end\n", __FILE__, __FUNCTION__);
     707
    627708    return 0;
    628709}
    629710
    630711/* return the size of the region starting at p, or EMPTY_SIZE if non
    631    existant region. */
    632 static unsigned long get_region_size(void *p)
    633 {
    634     unsigned long addr = (unsigned long)p;
     712   existent region. */
     713static size_t get_region_size(void *p)
     714{
     715    size_t addr = (size_t)p;
    635716    BoundEntry *e;
    636717
     
    642723    if (addr > e->size)
    643724        e = __bound_find_region(e, p);
    644     if (e->start != (unsigned long)p)
     725    if (e->start != (size_t)p)
    645726        return EMPTY_SIZE;
    646727    return e->size;
     
    710791    if (!ptr)
    711792        return NULL;
     793
     794    dprintf(stderr, "%s, %s calling __bound_new_region(%p, %x)\n",
     795           __FILE__, __FUNCTION__, ptr, (unsigned)size);
     796
    712797    __bound_new_region(ptr, size);
    713798    return ptr;
     
    739824    if (!ptr)
    740825        return NULL;
     826
     827    dprintf(stderr, "%s, %s calling __bound_new_region(%p, %x)\n",
     828           __FILE__, __FUNCTION__, ptr, (unsigned)size);
     829
    741830    __bound_new_region(ptr, size);
    742831    return ptr;
     
    756845{
    757846    void *ptr1;
    758     int old_size;
     847    size_t old_size;
    759848
    760849    if (size == 0) {
     
    791880{
    792881    BoundEntry *page, *e;
    793     int i, j;
    794 
    795     printf("region dump:\n");
     882    size_t i, j;
     883
     884    fprintf(stderr, "region dump:\n");
    796885    for(i=0;i<BOUND_T1_SIZE;i++) {
    797886        page = __bound_t1[i];
     
    800889            /* do not print invalid or empty entries */
    801890            if (e->size != EMPTY_SIZE && e->start != 0) {
    802                 printf("%08x:",
     891                fprintf(stderr, "%08x:",
    803892                       (i << (BOUND_T2_BITS + BOUND_T3_BITS)) +
    804893                       (j << BOUND_T3_BITS));
    805894                do {
    806                     printf(" %08lx:%08lx", e->start, e->start + e->size);
     895                    fprintf(stderr, " %08lx:%08lx", e->start, e->start + e->size);
    807896                    e = e->next;
    808897                } while (e != NULL);
    809                 printf("\n");
     898                fprintf(stderr, "\n");
    810899            }
    811900        }
     
    821910    if (size == 0)
    822911        return;
    823     p = __bound_ptr_add((void *)p, size);
     912    p = __bound_ptr_add((void *)p, size - 1);
    824913    if (p == INVALID_POINTER)
    825914        bound_error("invalid pointer");
     
    828917void *__bound_memcpy(void *dst, const void *src, size_t size)
    829918{
     919    void* p;
     920
     921    dprintf(stderr, "%s %s: start, dst=%p src=%p size=%x\n",
     922            __FILE__, __FUNCTION__, dst, src, (unsigned)size);
     923
    830924    __bound_check(dst, size);
    831925    __bound_check(src, size);
     
    833927    if (src >= dst && src < dst + size)
    834928        bound_error("overlapping regions in memcpy()");
    835     return memcpy(dst, src, size);
     929
     930    p = memcpy(dst, src, size);
     931
     932    dprintf(stderr, "%s %s: end, p=%p\n", __FILE__, __FUNCTION__, p);
     933    return p;
    836934}
    837935
     
    853951{
    854952    const char *p;
    855     int len;
     953    size_t len;
    856954
    857955    len = 0;
     
    869967char *__bound_strcpy(char *dst, const char *src)
    870968{
    871     int len;
     969    size_t len;
     970    void *p;
     971
     972    dprintf(stderr, "%s %s: strcpy start, dst=%p src=%p\n",
     973            __FILE__, __FUNCTION__, dst, src);
    872974    len = __bound_strlen(src);
    873     return __bound_memcpy(dst, src, len + 1);
    874 }
    875 
     975    p = __bound_memcpy(dst, src, len + 1);
     976    dprintf(stderr, "%s %s: strcpy end, p = %p\n",
     977            __FILE__, __FUNCTION__, p);
     978    return p;
     979}
  • EcnlProtoTool/trunk/tcc-0.9.27/lib/libtcc1.c

    r321 r331  
    104104union float_long {
    105105    float f;
    106     long l;
     106    unsigned int l;
    107107};
    108108
    109109/* XXX: we don't support several builtin supports for now */
    110 #ifndef __x86_64__
     110#if !defined __x86_64__ && !defined __arm__
    111111
    112112/* XXX: use gcc/tcc intrinsic ? */
    113 #if defined(__i386__)
     113#if defined __i386__
    114114#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
    115115  __asm__ ("subl %5,%1\n\tsbbl %3,%0"                                   \
     
    479479}
    480480
    481 #if defined(__i386__)
    482 /* FPU control word for rounding to nearest mode */
    483 unsigned short __tcc_fpu_control = 0x137f;
    484 /* FPU control word for round to zero mode for int conversion */
    485 unsigned short __tcc_int_fpu_control = 0x137f | 0x0c00;
    486 #endif
    487 
    488481#endif /* !__x86_64__ */
    489482
     
    558551}
    559552
     553long long __fixsfdi (float a1)
     554{
     555    long long ret; int s;
     556    ret = __fixunssfdi((s = a1 >= 0) ? a1 : -a1);
     557    return s ? ret : -ret;
     558}
     559
    560560unsigned long long __fixunsdfdi (double a1)
    561561{
     
    583583}
    584584
     585long long __fixdfdi (double a1)
     586{
     587    long long ret; int s;
     588    ret = __fixunsdfdi((s = a1 >= 0) ? a1 : -a1);
     589    return s ? ret : -ret;
     590}
     591
     592#ifndef __arm__
    585593unsigned long long __fixunsxfdi (long double a1)
    586594{
     
    606614}
    607615
    608 #if defined(__x86_64__) && !defined(_WIN64)
    609 
    610 /* helper functions for stdarg.h */
    611 
    612 #include <stdlib.h>
    613 #ifndef __TINYC__
    614 /* gives "incompatible types for redefinition of __va_arg" below */
    615 #include <stdio.h>
    616 #endif
    617 
    618 enum __va_arg_type {
    619     __va_gen_reg, __va_float_reg, __va_stack
    620 };
    621 
    622 /* GCC compatible definition of va_list. */
    623 struct __va_list_struct {
    624     unsigned int gp_offset;
    625     unsigned int fp_offset;
    626     union {
    627         unsigned int overflow_offset;
    628         char *overflow_arg_area;
    629     };
    630     char *reg_save_area;
    631 };
    632 
    633 void *__va_start(void *fp)
    634 {
    635     struct __va_list_struct *ap =
    636         (struct __va_list_struct *)malloc(sizeof(struct __va_list_struct));
    637     *ap = *(struct __va_list_struct *)((char *)fp - 16);
    638     ap->overflow_arg_area = (char *)fp + ap->overflow_offset;
    639     ap->reg_save_area = (char *)fp - 176 - 16;
    640     return ap;
    641 }
    642 
    643 void *__va_arg(struct __va_list_struct *ap,
    644                enum __va_arg_type arg_type,
    645                int size)
    646 {
    647     size = (size + 7) & ~7;
    648     switch (arg_type) {
    649     case __va_gen_reg:
    650         if (ap->gp_offset < 48) {
    651             ap->gp_offset += 8;
    652             return ap->reg_save_area + ap->gp_offset - 8;
    653         }
    654         size = 8;
    655         goto use_overflow_area;
    656 
    657     case __va_float_reg:
    658         if (ap->fp_offset < 128 + 48) {
    659             ap->fp_offset += 16;
    660             return ap->reg_save_area + ap->fp_offset - 16;
    661         }
    662         size = 8;
    663         goto use_overflow_area;
    664 
    665     case __va_stack:
    666     use_overflow_area:
    667         ap->overflow_arg_area += size;
    668         return ap->overflow_arg_area - size;
    669 
    670     default:
    671 #ifndef __TINYC__
    672         fprintf(stderr, "unknown ABI type for __va_arg\n");
    673 #endif
    674         abort();
    675     }
    676 }
    677 
    678 void *__va_copy(struct __va_list_struct *src)
    679 {
    680     struct __va_list_struct *dest =
    681         (struct __va_list_struct *)malloc(sizeof(struct __va_list_struct));
    682     *dest = *src;
    683     return dest;
    684 }
    685 
    686 void __va_end(struct __va_list_struct *ap)
    687 {
    688     free(ap);
    689 }
    690 
    691 #endif /* __x86_64__ */
     616long long __fixxfdi (long double a1)
     617{
     618    long long ret; int s;
     619    ret = __fixunsxfdi((s = a1 >= 0) ? a1 : -a1);
     620    return s ? ret : -ret;
     621}
     622#endif /* !ARM */
Note: See TracChangeset for help on using the changeset viewer.