@@ -75,6 +75,8 @@ TCC_SEM(static tcc_compile_sem);
75
75
/* an array of pointers to memory to be free'd after errors */
76
76
ST_DATA void * * stk_data ;
77
77
ST_DATA int nb_stk_data ;
78
+ /* option -d<num> (for general development purposes) */
79
+ ST_DATA int g_debug ;
78
80
79
81
/********************************************************/
80
82
#ifdef _WIN32
@@ -547,9 +549,8 @@ static void tcc_split_path(TCCState *s, void *p_ary, int *p_nb_ary, const char *
547
549
}
548
550
if (str .size ) {
549
551
cstr_ccat (& str , '\0' );
550
- dynarray_add (p_ary , p_nb_ary , tcc_strdup ( str .data ) );
552
+ dynarray_add (p_ary , p_nb_ary , str .data );
551
553
}
552
- cstr_free (& str );
553
554
in = p + 1 ;
554
555
} while (* p );
555
556
}
@@ -848,6 +849,9 @@ LIBTCCAPI TCCState *tcc_new(void)
848
849
s -> include_stack_ptr = s -> include_stack ;
849
850
850
851
tcc_set_lib_path (s , CONFIG_TCCDIR );
852
+ #ifdef CONFIG_TCC_SWITCHES /* predefined options */
853
+ tcc_set_options (s , CONFIG_TCC_SWITCHES );
854
+ #endif
851
855
return s ;
852
856
}
853
857
@@ -867,6 +871,7 @@ LIBTCCAPI void tcc_delete(TCCState *s1)
867
871
tcc_free (s1 -> tcc_lib_path );
868
872
tcc_free (s1 -> soname );
869
873
tcc_free (s1 -> rpath );
874
+ tcc_free (s1 -> elfint );
870
875
tcc_free (s1 -> elf_entryname );
871
876
tcc_free (s1 -> init_symbol );
872
877
tcc_free (s1 -> fini_symbol );
@@ -1225,17 +1230,15 @@ LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname)
1225
1230
"%s/lib%s.a" ,
1226
1231
NULL
1227
1232
};
1228
-
1229
- const char * const * pp = s -> static_link
1230
- ? libs + sizeof (libs ) / sizeof (* libs ) - 2
1231
- : libs ;
1232
-
1233
1233
/* if libraryname begins with a colon, it means search lib paths for
1234
1234
exactly the following file, without lib prefix or anything */
1235
- if (* libraryname == ':' )
1235
+ if (* libraryname == ':' ) {
1236
1236
libraryname ++ ;
1237
- else {
1237
+ } else {
1238
1238
int flags = s -> filetype & AFF_WHOLE_ARCHIVE ;
1239
+ const char * const * pp = libs ;
1240
+ if (s -> static_link )
1241
+ pp += sizeof (libs ) / sizeof (* libs ) - 2 ; /* only "%s/lib%s.a" */
1239
1242
while (* pp ) {
1240
1243
int ret = tcc_add_library_internal (s , * pp ,
1241
1244
libraryname , flags , s -> library_paths , s -> nb_library_paths );
@@ -1341,7 +1344,7 @@ static int link_option(const char *str, const char *val, const char **ptr)
1341
1344
if (* p != ',' && * p != '=' )
1342
1345
return 0 ;
1343
1346
p ++ ;
1344
- } else if (* p ) {
1347
+ } else if (* p && * p != ',' ) {
1345
1348
return 0 ;
1346
1349
}
1347
1350
* ptr = p ;
@@ -1890,7 +1893,6 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
1890
1893
++ s -> verbose ;
1891
1894
continue ;
1892
1895
}
1893
- reparse :
1894
1896
if (r [0 ] != '-' || r [1 ] == '\0' ) {
1895
1897
args_parser_add_file (s , r , s -> filetype );
1896
1898
if (run ) {
@@ -1968,7 +1970,8 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
1968
1970
goto enable_backtrace ;
1969
1971
enable_backtrace :
1970
1972
s -> do_backtrace = 1 ;
1971
- s -> do_debug = s -> do_debug ? s -> do_debug : 1 ;
1973
+ if (0 == s -> do_debug )
1974
+ s -> do_debug = 1 ;
1972
1975
s -> dwarf = CONFIG_DWARF_VERSION ;
1973
1976
break ;
1974
1977
#ifdef CONFIG_TCC_BCHECK
@@ -1982,6 +1985,8 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
1982
1985
s -> dwarf = CONFIG_DWARF_VERSION ;
1983
1986
if (strstart ("dwarf" , & optarg )) {
1984
1987
s -> dwarf = (* optarg ) ? (0 - atoi (optarg )) : DEFAULT_DWARF_VERSION ;
1988
+ } else if (0 == strcmp ("stabs" , optarg )) {
1989
+ s -> dwarf = 0 ;
1985
1990
} else if (isnum (* optarg )) {
1986
1991
x = * optarg - '0' ;
1987
1992
/* -g0 = no info, -g1 = lines/functions only, -g2 = full info */
@@ -2007,7 +2012,7 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
2007
2012
else if (* optarg == 't' )
2008
2013
s -> dflag = 16 ;
2009
2014
else if (isnum (* optarg ))
2010
- s -> g_debug |= atoi (optarg );
2015
+ g_debug |= atoi (optarg );
2011
2016
else
2012
2017
goto unsupported_option ;
2013
2018
break ;
@@ -2106,8 +2111,15 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
2106
2111
return -1 ;
2107
2112
break ;
2108
2113
case TCC_OPTION_Wp :
2109
- r = optarg ;
2110
- goto reparse ;
2114
+ {
2115
+ char * p = tcc_strdup (optarg ), * q = p ;
2116
+ while (!!(q = strchr (q , ',' ))) * q ++ = ' ' ;
2117
+ x = tcc_set_options (s , p );
2118
+ tcc_free (p );
2119
+ if (x < 0 )
2120
+ return -1 ;
2121
+ break ;
2122
+ }
2111
2123
case TCC_OPTION_E :
2112
2124
x = TCC_OUTPUT_PREPROCESS ;
2113
2125
goto set_output_type ;
@@ -2156,7 +2168,7 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int *pargc, char ***pargv, int optind)
2156
2168
s -> filetype = x | (s -> filetype & ~AFF_TYPE_MASK );
2157
2169
break ;
2158
2170
case TCC_OPTION_O :
2159
- s -> optimize = atoi (optarg ) ;
2171
+ s -> optimize = isnum (optarg [ 0 ]) ? optarg [ 0 ] - '0' : 1 /* -O -Os */ ;
2160
2172
break ;
2161
2173
case TCC_OPTION_print_search_dirs :
2162
2174
x = OPT_PRINT_DIRS ;
0 commit comments