tcc -vv/--print-search-dirs: print more info
authorgrischka <grischka>
Sat, 9 Feb 2013 23:38:40 +0000 (10 00:38 +0100)
committergrischka <grischka>
Sat, 9 Feb 2013 23:38:40 +0000 (10 00:38 +0100)
tests/Makefile:
- print-search-dirs when 'hello' fails
- split off hello-run

win32/include/_mingw.h:
- fix for compatibility with mingw headers
  (While our headers in win32 are from mingw-64 and don't have
  the problem)

tiny_libmaker:
- don't use "dangerous" mktemp

lib/Makefile
libtcc.c
tcc.c
tcc.h
tests/Makefile
win32/include/_mingw.h
win32/tools/tiny_libmaker.c

index 945a94b..e125f2c 100644 (file)
@@ -91,7 +91,7 @@ $(DIR)/%.o : %.c
 $(DIR)/%.o : %.S
        $(XCC) -c $< -o $@ $(XFLAGS)
 $(DIR)/%$(EXESUF) : $(TOP)/win32/tools/%.c
-       $(CC) -Os -s -w -o $@ $< $(XFLAGS) $(LDFLAGS)
+       $(CC) -Os -s -o $@ $< $(XFLAGS) $(LDFLAGS)
 
 $(OBJ) $(XAR) : $(DIR)/exists
 $(DIR)/exists :
index b0b2410..968c6e4 100644 (file)
--- a/libtcc.c
+++ b/libtcc.c
@@ -1589,20 +1589,6 @@ PUB_FUNC const char * tcc_set_linker(TCCState *s, char *option, int multi)
     return NULL;
 }
 
-PUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time)
-{
-    double tt;
-    tt = (double)total_time / 1000000.0;
-    if (tt < 0.001)
-        tt = 0.001;
-    if (total_bytes < 1)
-        total_bytes = 1;
-    printf("%d idents, %d lines, %d bytes, %0.3f s, %d lines/s, %0.1f MB/s\n", 
-           tok_ident - TOK_IDENT, total_lines, total_bytes,
-           tt, (int)(total_lines / tt),
-           total_bytes / tt / 1000000.0);
-}
-
 /* set CONFIG_TCCDIR at runtime */
 LIBTCCAPI void tcc_set_lib_path(TCCState *s, const char *path)
 {
@@ -1668,3 +1654,67 @@ PUB_FUNC void tcc_gen_makedeps(TCCState *s, const char *target, const char *file
     fprintf(depout, "\n");
     fclose(depout);
 }
+
+PUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time)
+{
+    double tt;
+    tt = (double)total_time / 1000000.0;
+    if (tt < 0.001)
+        tt = 0.001;
+    if (total_bytes < 1)
+        total_bytes = 1;
+    printf("%d idents, %d lines, %d bytes, %0.3f s, %d lines/s, %0.1f MB/s\n", 
+           tok_ident - TOK_IDENT, total_lines, total_bytes,
+           tt, (int)(total_lines / tt),
+           total_bytes / tt / 1000000.0);
+}
+
+static void print_paths(const char *msg, char **paths, int nb_paths)
+{
+    int i;
+    printf("%s:\n%s", msg, nb_paths ? "" : "  -\n");
+    for(i = 0; i < nb_paths; i++)
+        printf("  %s\n", paths[i]);
+}
+
+PUB_FUNC void tcc_display_info(TCCState *s, int what)
+{
+    switch (what) {
+    case 0:
+        printf("tcc version %s ("
+#ifdef TCC_TARGET_I386
+        "i386"
+# ifdef TCC_TARGET_PE
+        " Win32"
+# endif
+#elif defined TCC_TARGET_X86_64
+        "x86-64"
+# ifdef TCC_TARGET_PE
+        " Win64"
+# endif
+#elif defined TCC_TARGET_ARM
+        "ARM"
+# ifdef TCC_ARM_HARDFLOAT
+        " Hard Float"
+# endif
+# ifdef TCC_TARGET_PE
+        " WinCE"
+# endif
+#endif
+#ifndef TCC_TARGET_PE
+# ifdef __linux
+        " Linux"
+# endif
+#endif
+        ")\n", TCC_VERSION);
+        break;
+    case 1:
+        printf("install: %s/\n", s->tcc_lib_path);
+        /* print_paths("programs", NULL, 0); */
+        print_paths("crt", s->crt_paths, s->nb_crt_paths);
+        print_paths("libraries", s->library_paths, s->nb_library_paths);
+        print_paths("include", s->sysinclude_paths, s->nb_sysinclude_paths);
+        break;
+    }
+}
+
diff --git a/tcc.c b/tcc.c
index 3116c40..bad9b4e 100644 (file)
--- a/tcc.c
+++ b/tcc.c
@@ -508,17 +508,21 @@ int main(int argc, char **argv)
 #endif
 
     if (print_search_dirs) {
-        /* enough for Linux kernel */
-        printf("install: %s/\n", s->tcc_lib_path);
+psd:
+        tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
+        tcc_display_info(s, 1);
         return 0;
     }
 
     if (s->verbose)
-        printf("tcc version %s\n", TCC_VERSION);
+        tcc_display_info(s, 0);
 
     if (optind == 0 || nb_files == 0) {
-        if (optind && s->verbose)
+        if (optind && s->verbose) {
+            if (s->verbose == 2)
+                goto psd;
             return 0;
+        }
         help();
         return 1;
     }
diff --git a/tcc.h b/tcc.h
index c5c7c41..460c417 100644 (file)
--- a/tcc.h
+++ b/tcc.h
@@ -1067,6 +1067,7 @@ PUB_FUNC int tcc_set_flag(TCCState *s, const char *flag_name, int value);
 PUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time);
 PUB_FUNC char *tcc_default_target(TCCState *s, const char *default_file);
 PUB_FUNC void tcc_gen_makedeps(TCCState *s, const char *target, const char *filename);
+PUB_FUNC void tcc_display_info(TCCState *s, int what);
 
 /* ------------ tccpp.c ------------ */
 
index 0e6fc46..6e0f728 100644 (file)
@@ -8,7 +8,8 @@ VPATH = $(top_srcdir)/tests
 
 # what tests to run
 TESTS = \
- hello \
+ hello-exe \
+ hello-run \
  libtest \
  test3 \
  moretests
@@ -26,7 +27,7 @@ ifdef CONFIG_WIN32
  TESTS := $(filter-out test3,$(TESTS))
 endif
 ifeq ($(TARGETOS),Darwin)
- TESTS := $(filter-out hello test3 btest,$(TESTS))
+ TESTS := $(filter-out hello-exe test3 btest,$(TESTS))
 endif
 
 ifdef DISABLE_STATIC
@@ -57,9 +58,12 @@ endif
 
 all test : $(TESTS)
 
-hello: ../examples/ex1.c
+hello-exe: ../examples/ex1.c
+       @echo ------------ $@ ------------
+       $(TCC) $< -o hello$(EXESUF) || ($(TOP)/tcc -vv; exit 1) && ./hello$(EXESUF)
+
+hello-run: ../examples/ex1.c
        @echo ------------ $@ ------------
-       $(TCC) $< -o $@$(EXESUF) && ./$@$(EXESUF)
        $(TCC) -run $<
 
 libtest: libtcc_test$(EXESUF) $(LIBTCC1)
@@ -192,3 +196,4 @@ clean:
        $(MAKE) -C tests2 $@
        rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \
           hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h
+
index 0d2f039..14cd718 100644 (file)
@@ -37,8 +37,9 @@
 #define __unaligned __attribute__((packed))
 #define __fastcall __attribute__((fastcall))
 
-#define __MINGW_IMPORT extern __declspec(dllimport)
+#define __MSVCRT__ 1
 #undef _MSVCRT_
+#define __MINGW_IMPORT extern __declspec(dllimport)
 #define __MINGW_ATTRIB_NORETURN
 #define __MINGW_ATTRIB_CONST
 #define __MINGW_ATTRIB_DEPRECATED
index 42373d8..a85c685 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#ifdef _WIN32
-#include <io.h> /* for mktemp */
-#endif
-
 #include "../../elf.h"
 
 #ifdef TCC_TARGET_X86_64
@@ -77,7 +73,7 @@ ArHdr arhdro = {
 
 int main(int argc, char **argv)
 {
-    FILE *fi, *fh, *fo;
+    FILE *fi, *fh = NULL, *fo = NULL;
     ElfW(Ehdr) *ehdr;
     ElfW(Shdr) *shdr;
     ElfW(Sym) *sym;
@@ -89,6 +85,7 @@ int main(int argc, char **argv)
     int istrlen, strpos = 0, fpos = 0, funccnt = 0, funcmax, hofs;
     char afile[260], tfile[260], stmp[20];
     char *file, *name;
+    int ret = 2;
 
 
     strcpy(afile, "ar_test.a");
@@ -111,19 +108,17 @@ int main(int argc, char **argv)
         }
     }
 
-    strcpy(tfile, "./XXXXXX");
-    if (!mktemp(tfile) || (fo = fopen(tfile, "wb+")) == NULL)
+    if ((fh = fopen(afile, "wb")) == NULL)
     {
-        fprintf(stderr, "Can't open temporary file %s\n", tfile);
-        return 2;
+        fprintf(stderr, "Can't open file %s \n", afile);
+        goto the_end;
     }
 
-    if ((fh = fopen(afile, "wb")) == NULL)
+    sprintf(tfile, "%s.tmp", afile);
+    if ((fo = fopen(tfile, "wb+")) == NULL)
     {
-        fprintf(stderr, "Can't open file %s \n", afile);
-        fclose(fo);
-        remove(tfile);
-        return 2;
+        fprintf(stderr, "Can't create temporary file %s\n", tfile);
+        goto the_end;
     }
 
     funcmax = 250;
@@ -140,9 +135,7 @@ int main(int argc, char **argv)
         if ((fi = fopen(argv[iarg], "rb")) == NULL)
         {
             fprintf(stderr, "Can't open file %s \n", argv[iarg]);
-            fclose(fo);
-            remove(tfile);
-            return 2;
+            goto the_end;
         }
         fseek(fi, 0, SEEK_END);
         fsize = ftell(fi);
@@ -152,14 +145,13 @@ int main(int argc, char **argv)
         fclose(fi);
 
         //printf("%s:\n", argv[iarg]);
+
         // elf header
         ehdr = (ElfW(Ehdr) *)buf;
         if (ehdr->e_ident[4] != ELFCLASSW)
         {
             fprintf(stderr, "Unsupported Elf Class: %s\n", argv[iarg]);
-            fclose(fo);
-            remove(tfile);
-            return 2;
+            goto the_end;
         }
 
         shdr = (ElfW(Shdr) *) (buf + ehdr->e_shoff + ehdr->e_shstrndx * ehdr->e_shentsize);
@@ -167,7 +159,8 @@ int main(int argc, char **argv)
         for (i = 0; i < ehdr->e_shnum; i++)
         {
             shdr = (ElfW(Shdr) *) (buf + ehdr->e_shoff + i * ehdr->e_shentsize);
-            if (!shdr->sh_offset) continue;
+            if (!shdr->sh_offset)
+                continue;
             if (shdr->sh_type == SHT_SYMTAB)
             {
                 symtab = (char *)(buf + shdr->sh_offset);
@@ -210,7 +203,7 @@ int main(int argc, char **argv)
         }
 
         file = argv[iarg];
-        for (name = strchr(file, 0); 
+        for (name = strchr(file, 0);
              name > file && name[-1] != '/' && name[-1] != '\\';
              --name);
         istrlen = strlen(name);
@@ -219,7 +212,6 @@ int main(int argc, char **argv)
         memset(arhdro.ar_name, ' ', sizeof(arhdro.ar_name));
         memcpy(arhdro.ar_name, name, istrlen);
         arhdro.ar_name[istrlen] = '/';
-
         sprintf(stmp, "%-10d", fsize);
         memcpy(&arhdro.ar_size, stmp, 10);
         fwrite(&arhdro, sizeof(arhdro), 1, fo);
@@ -229,36 +221,38 @@ int main(int argc, char **argv)
         fpos += (fsize + sizeof(arhdro));
     }
     hofs = 8 + sizeof(arhdr) + strpos + (funccnt+1) * sizeof(int);
-    if ((hofs & 1)) {   // align
-        hofs++;
-        fpos = 1;
-    } else fpos = 0;
+    fpos = 0;
+    if ((hofs & 1)) // align
+        hofs++, fpos = 1;
     // write header
     fwrite("!<arch>\n", 8, 1, fh);
     sprintf(stmp, "%-10d", (int)(strpos + (funccnt+1) * sizeof(int)));
     memcpy(&arhdr.ar_size, stmp, 10);
     fwrite(&arhdr, sizeof(arhdr), 1, fh);
     afpos[0] = le2belong(funccnt);
-    for (i=1; i<=funccnt; i++) {
+    for (i=1; i<=funccnt; i++)
         afpos[i] = le2belong(afpos[i] + hofs);
-    }
     fwrite(afpos, (funccnt+1) * sizeof(int), 1, fh);
     fwrite(anames, strpos, 1, fh);
-    if (fpos) fwrite("", 1, 1, fh);
+    if (fpos)
+        fwrite("", 1, 1, fh);
     // write objects
     fseek(fo, 0, SEEK_END);
     fsize = ftell(fo);
     fseek(fo, 0, SEEK_SET);
     buf = malloc(fsize + 1);
     fread(buf, fsize, 1, fo);
-    fclose(fo);
     fwrite(buf, fsize, 1, fh);
-    fclose(fh);
     free(buf);
+    ret = 0;
+the_end:
     if (anames)
         free(anames);
     if (afpos)
         free(afpos);
-    remove(tfile);
-    return 0;
+    if (fh)
+        fclose(fh);
+    if (fo)
+        fclose(fo), remove(tfile);
+    return ret;
 }