This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[PATCH] Allow multiple dlltools to be run concurrently in the same directory
- From: Christopher Faylor <cgf at redhat dot com>
- To: binutils at sources dot redhat dot com
- Date: Fri, 4 Jul 2003 23:00:00 -0400
- Subject: [PATCH] Allow multiple dlltools to be run concurrently in the same directory
It has always bugged me that you can't use make's -j flag in any directory
which uses dlltool since the object and assembler files that dlltool creates
are not unique.
I inadvertently checked in the beginnings of a change which added some
logic to rectify this behavior a while ago. The patch below finishes
the job. Temporary files are built based on the pid. I used a base 26
encoding of the pid to try to keep the filenames as short as possible so
that there wouldn't be too large of an increase in size for the import
libraries.
This change finally allows me to do a "make -j4 CC=distcc" from the winsup
directory without getting incorrect import libraries or segvs from dlltool.
I've checked this in.
cgf
2003-07-04 Christopher Faylor <cgf@redhat.com>
* dlltool.c (prefix_encode): New function. Encode temp file prefix
from pid.
(dlltmp): Pass address of pointer being alloced or suffer neverending
mallocs.
(make_one_lib_file): Allocate enough space for new longer stub names.
(gen_lib_file): Ditto.
(main): Generate the temp file prefix from the pid if prefix was not
specified on the command line.
Index: dlltool.c
===================================================================
RCS file: /cvs/src/src/binutils/dlltool.c,v
retrieving revision 1.40
diff -u -p -r1.40 dlltool.c
--- dlltool.c 22 Mar 2003 21:04:50 -0000 1.40
+++ dlltool.c 5 Jul 2003 02:56:01 -0000
@@ -350,7 +350,7 @@ static iheadtype *import_list = NULL;
static char *as_name = NULL;
static char * as_flags = "";
-static char *tmp_prefix = "d";
+static char *tmp_prefix;
static int no_idata4;
static int no_idata5;
@@ -440,12 +440,12 @@ char *tmp_tail_s_buf;
char *tmp_tail_o_buf;
char *tmp_stub_buf;
-#define TMP_ASM dlltmp (tmp_asm_buf, "%sc.s")
-#define TMP_HEAD_S dlltmp (tmp_head_s_buf, "%sh.s")
-#define TMP_HEAD_O dlltmp (tmp_head_o_buf, "%sh.o")
-#define TMP_TAIL_S dlltmp (tmp_tail_s_buf, "%st.s")
-#define TMP_TAIL_O dlltmp (tmp_tail_o_buf, "%st.o")
-#define TMP_STUB dlltmp (tmp_stub_buf, "%ss")
+#define TMP_ASM dlltmp (&tmp_asm_buf, "%sc.s")
+#define TMP_HEAD_S dlltmp (&tmp_head_s_buf, "%sh.s")
+#define TMP_HEAD_O dlltmp (&tmp_head_o_buf, "%sh.o")
+#define TMP_TAIL_S dlltmp (&tmp_tail_s_buf, "%st.s")
+#define TMP_TAIL_O dlltmp (&tmp_tail_o_buf, "%st.o")
+#define TMP_STUB dlltmp (&tmp_stub_buf, "%ss")
/* This bit of assemly does jmp * .... */
static const unsigned char i386_jtab[] =
@@ -751,14 +751,31 @@ static void inform
PARAMS ((const char *, ...));
static char *
-dlltmp PARAMS ((char *buf, const char *fmt))
+prefix_encode PARAMS ((char *start, unsigned code))
{
- if (!buf)
- buf = malloc (strlen (tmp_prefix) + 17);
- sprintf (buf, fmt, tmp_prefix);
+ static char alpha[] = "abcdefghijklmnopqrstuvwxyz";
+ static char buf[32];
+ char *p;
+ strcpy (buf, start);
+ p = strchr (buf, '\0');
+ do
+ *p++ = alpha[code % sizeof (alpha)];
+ while ((code /= sizeof (alpha)) != 0);
+ *p = '\0';
return buf;
}
+static char *
+dlltmp PARAMS ((char **buf, const char *fmt))
+{
+ if (!*buf)
+ {
+ *buf = malloc (strlen (tmp_prefix) + 64);
+ sprintf (*buf, fmt, tmp_prefix);
+ }
+ return *buf;
+}
+
static void
inform VPARAMS ((const char * message, ...))
{
@@ -2348,7 +2365,7 @@ make_one_lib_file (exp, i)
asymbol * ptrs[NSECS + 4 + EXTRA + 1];
flagword applicable;
- char * outname = xmalloc (10);
+ char * outname = xmalloc (strlen (TMP_STUB) + 10);
int oidx = 0;
@@ -2925,7 +2942,7 @@ gen_lib_file ()
{
char *name;
- name = (char *) alloca (sizeof TMP_STUB + 10);
+ name = (char *) alloca (strlen (TMP_STUB) + 10);
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
{
sprintf (name, "%s%05d.o", TMP_STUB, i);
@@ -3420,6 +3437,9 @@ main (ac, av)
break;
}
}
+
+ if (!tmp_prefix)
+ tmp_prefix = prefix_encode ("d", getpid ());
for (i = 0; mtable[i].type; i++)
if (strcmp (mtable[i].type, mname) == 0)