grischka wrote:
> tcc -c doesn't load libraries ...

Sure. In fact, I found the opportunity by trying just tcc -c first. :)
but this code also runs @tcc link time as well as the -run e.g. I gave.
One of the original sales points of tcc was #!/bin/tcc -run and such
"scripts" can easily be run 1000s of times on 1000s of files/something.

>Everything very good, except what is the scenario where the difference
>of 0.00025 seconds would matter?

Linker scripts could be much larger (and more numerous) than the tiny
253 byte ones on my test system, e.g. some few thousand byte comment.
I agree that I could have "sold" the idea better.  One can easily
construct an example with some multi-kB LICENSE comment.  Then my 1.3x
faster would probably become 5X faster. Perhaps a small absolute scale,
but some people might link thousands of binaries.  (I routinely link
on the order of a hundred.)

So those are 3 scenarios for you: 1) #!/ scripts, 2) many linkings,
and 3) giant linker scripts.  Anyway, mostly it seemed needlessly
wasteful and buffered IO seems like a "done deal" & easy enough. :)

>allocate the buffer & variables on the stack and just have a pointer

Thanks!  Great suggestion!  Done in the attached new patch.  I did
not put an fd in the struct io since that would mean more invasive
logic changes to the parser code, but I agree doing all that would
be nicer.  I also just called the struct "io" with the idea this
could maybe be done someday and maybe another application may arise
as people sure like to use files for a lot of things.  But the field
ld_io since it's just for that.
diff --git a/tcc.h b/tcc.h
index 687fb607..c4f68074 100644
--- a/tcc.h
+++ b/tcc.h
@@ -725,6 +725,12 @@ struct sym_attr {
 #endif
 };
 
+struct io {
+    int   n;    /* number of bytes of buf[] used */
+    char *p;    /* pointer to next byte of buf[] to use */
+    char  buf[1024];
+};
+
 struct TCCState {
     unsigned char verbose; /* if true, display some information during compilation */
     unsigned char nostdinc; /* if true, no standard headers are added */
@@ -989,6 +995,7 @@ struct TCCState {
 
     /* used by tcc_load_ldscript */
     int fd, cc;
+    struct io *ld_io;
 
     /* for warnings/errors for object files */
     const char *current_filename;
diff --git a/tccelf.c b/tccelf.c
index 8e11c1bf..3406e55d 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -3799,17 +3799,24 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level)
 #define LD_TOK_NAME 256
 #define LD_TOK_EOF  (-1)
 
+static char ld_ioFill(TCCState *s1) {
+    int m = read(s1->fd, s1->ld_io->buf, sizeof s1->ld_io->buf);
+    if (m > 0) {
+        s1->ld_io->p = &s1->ld_io->buf[1];
+        s1->ld_io->n = m - 1;
+        return s1->ld_io->buf[0];
+    }
+    return CH_EOF;
+}
+
 static int ld_inp(TCCState *s1)
 {
-    char b;
     if (s1->cc != -1) {
         int c = s1->cc;
         s1->cc = -1;
         return c;
     }
-    if (1 == read(s1->fd, &b, 1))
-        return b;
-    return CH_EOF;
+    return s1->ld_io->n-- > 0 ? *s1->ld_io->p++ : ld_ioFill(s1);
 }
 
 /* return next ld script token */
@@ -4021,6 +4028,8 @@ ST_FUNC int tcc_load_ldscript(TCCState *s1, int fd)
 {
     char cmd[64];
     char filename[1024];
+    struct io io = { 0, 0, {0} };
+    s1->ld_io = &io;
     int t, ret;
 
     s1->fd = fd;
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to