Files
haikuports/dev-embedded/sdcc/patches/sdcc-3.6.0.patchset
Adrien Destugues 9f2c51a9f9 SDCC: update to latest release
- Perform an out of source build
- Fix some build issues
- This version builds with an up to date GCC host
2017-01-15 22:10:45 +01:00

705 lines
18 KiB
Plaintext

From a95501e57f35c71394748a6656e52581ab2a4932 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:25:39 +0200
Subject: let sdbinutils know about Haiku.
diff --git a/support/sdbinutils/bfd/config.bfd b/support/sdbinutils/bfd/config.bfd
index a1a8311..2e2f99d 100644
--- a/support/sdbinutils/bfd/config.bfd
+++ b/support/sdbinutils/bfd/config.bfd
@@ -725,6 +725,9 @@ case "${targ}" in
targ_defvec=i386_elf32_vec
targ_selvecs="i386_pe_vec i386_pei_vec"
;;
+ i[3-7]86-*-haiku*)
+ targ_defvec=i386_elf32_vec
+ ;;
i[3-7]86-*-interix*)
targ_defvec=i386_pei_vec
targ_selvecs="i386_pe_vec"
--
2.7.0
From 33d4dfa0af15f64b9ef9313f53fd1594907814e7 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:26:14 +0200
Subject: Missing include.
diff --git a/sim/ucsim/cmd.src/newcmdposixcl.h b/sim/ucsim/cmd.src/newcmdposixcl.h
index 5050d2f..ef3ed70 100644
--- a/sim/ucsim/cmd.src/newcmdposixcl.h
+++ b/sim/ucsim/cmd.src/newcmdposixcl.h
@@ -32,6 +32,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "newcmdcl.h"
#include "cmdutil.h"
+#include <sys/select.h>
/*
* Command fd console
--
2.7.0
From 75bb84c28fb9bcee9236d5490112e5a5a0edb3be Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:59:31 +0200
Subject: strings.h fix.
diff --git a/sim/ucsim/pobj.cc b/sim/ucsim/pobj.cc
index e809980..166d8b1 100644
--- a/sim/ucsim/pobj.cc
+++ b/sim/ucsim/pobj.cc
@@ -29,6 +29,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include <stdio.h>
#include <stdlib.h>
+#include <strings.h>
#include "pstr.h"
/*#include "pobjt.h"*/
--
2.7.0
From aa034f022a15f189c4d20c36578e8423b77ba5ea Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:59:16 +0200
Subject: Remove hardcoded -lm
diff --git a/sdas/as6808/Makefile.in b/sdas/as6808/Makefile.in
index 9ed2faf..407699d 100644
--- a/sdas/as6808/Makefile.in
+++ b/sdas/as6808/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/as8051/Makefile.in b/sdas/as8051/Makefile.in
index 121110b..5df8be3 100644
--- a/sdas/as8051/Makefile.in
+++ b/sdas/as8051/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/as8xcxxx/Makefile.in b/sdas/as8xcxxx/Makefile.in
index 5dbfade..2070d1f 100644
--- a/sdas/as8xcxxx/Makefile.in
+++ b/sdas/as8xcxxx/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/asgb/Makefile.in b/sdas/asgb/Makefile.in
index e6da6ac..fe65407 100644
--- a/sdas/asgb/Makefile.in
+++ b/sdas/asgb/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/asrab/Makefile.in b/sdas/asrab/Makefile.in
index 2924ab4..fa52fe2 100644
--- a/sdas/asrab/Makefile.in
+++ b/sdas/asrab/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/asstm8/Makefile.in b/sdas/asstm8/Makefile.in
index 812b484..4a056f7 100755
--- a/sdas/asstm8/Makefile.in
+++ b/sdas/asstm8/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/astlcs90/Makefile.in b/sdas/astlcs90/Makefile.in
index c3e6a21..e50587b 100644
--- a/sdas/astlcs90/Makefile.in
+++ b/sdas/astlcs90/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/sdas/asz80/Makefile.in b/sdas/asz80/Makefile.in
index d8cc0e1..6aa7532 100644
--- a/sdas/asz80/Makefile.in
+++ b/sdas/asz80/Makefile.in
@@ -37,7 +37,7 @@ VPATH = @srcdir@
CPPFLAGS = @CPPFLAGS@ -DSDCDB -DNOICE -DINDEXLIB -I. -I$(srcdir) -I$(srcdir)/../asxxsrc -I$(srcdir)/../../support/util
CFLAGS = @CFLAGS@ @WALL_FLAG@ $(CPPFLAGS)
LDFLAGS = @LDFLAGS@
-LIBS = -lm
+LIBS =
OBJDIR = obj
diff --git a/src/Makefile.in b/src/Makefile.in
index fc22c22..ebf63f1 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -15,7 +15,7 @@ PORTS = $(shell cat ../ports.build)
ALLPORTS = $(shell cat ../ports.all)
PORT_LIBS = $(PORTS:%=%/port.a)
-LIBS = -lm @LIBS@
+LIBS = @LIBS@
CFLAGS = @CFLAGS@ @WALL_FLAG@
CXXFLAGS = @CXXFLAGS@ @WALL_FLAG@
--
2.7.0
From f28f97241c95b6434d9a326d8349f25cd16bebfb Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Fri, 22 Jan 2016 21:01:19 +0100
Subject: Import Kevin Thacker patch for runtime relocation support.
diff --git a/sdas/linksrc/Makefile.in b/sdas/linksrc/Makefile.in
index 56537a5..35f1922 100644
--- a/sdas/linksrc/Makefile.in
+++ b/sdas/linksrc/Makefile.in
@@ -47,7 +47,7 @@ ASXXLIBSRC = strcmpi.c
SRC = lk_readnl.c lkaomf51.c lkar.c lkarea.c lkdata.c lkelf.c lkeval.c \
lkhead.c lklex.c lklib.c lklibr.c lklist.c lkmain.c lkmem.c \
lknoice.c lkout.c lkrel.c lkrloc.c lkrloc3.c lks19.c lksdcclib.c \
- lksym.c sdld.c lksdcdb.c lkbank.c
+ lksym.c sdld.c lksdcdb.c lkbank.c lkrrel.c
LKSOURCES = $(SRC) $(ASXXLIBSRC:%.c=$(ASXXLIB)/%.c)
diff --git a/sdas/linksrc/aslink.h b/sdas/linksrc/aslink.h
index e0865f8..d9f6316 100644
--- a/sdas/linksrc/aslink.h
+++ b/sdas/linksrc/aslink.h
@@ -1033,6 +1033,8 @@ extern int yflag; /* -y, enable SDCC Debug output
*/
#endif
+extern int hflag; /* Generate relocatable executable
+ */
extern int pflag; /* print linker command file flag
*/
extern int uflag; /* Listing relocation flag
diff --git a/sdas/linksrc/lkdata.c b/sdas/linksrc/lkdata.c
index bb83900..bfaa197 100644
--- a/sdas/linksrc/lkdata.c
+++ b/sdas/linksrc/lkdata.c
@@ -66,6 +66,9 @@ int oflag; /* Output file type flag
int objflg; /* Linked file/library object output flag
*/
+int hflag; /* Generate relocatable executable
+ */
+
#if NOICE
int jflag; /* NoICE output flag
*/
diff --git a/sdas/linksrc/lkmain.c b/sdas/linksrc/lkmain.c
index 1cc7a45..9d6f916 100644
--- a/sdas/linksrc/lkmain.c
+++ b/sdas/linksrc/lkmain.c
@@ -233,6 +233,7 @@ main(int argc, char *argv[])
startp->f_idp = "";
pflag = 1;
+ hflag = 0;
for(i=1; i<argc; i++) {
ip = ib;
@@ -960,6 +961,11 @@ parse()
}
return(0);
+ case 'h':
+ case 'H':
+ hflag = 1;
+ break;
+
case 'I':
if (is_sdld() && !(TARGET_IS_Z80 || TARGET_IS_GB)) {
iramsav();
diff --git a/sdas/linksrc/lkrloc3.c b/sdas/linksrc/lkrloc3.c
index cf184f2..6f11cdc 100644
--- a/sdas/linksrc/lkrloc3.c
+++ b/sdas/linksrc/lkrloc3.c
@@ -31,6 +31,7 @@
*/
#include "aslink.h"
+#include "lkrrel.h"
/*)Module lkrloc3.c
*
@@ -332,6 +333,9 @@ relr3(void)
* Do remaining relocations
*/
while (more()) {
+ int output_relocation_record;
+ int raddr;
+
error = 0;
mode = (int) eval();
@@ -390,6 +394,95 @@ relr3(void)
reli -= paga + pags;
}
+ /* KevT 28-05-2005 */
+
+ if (hflag)
+ {
+ output_relocation_record = 0;
+ if (mode & R3_SYM)
+ {
+ /* If the symbol is defined in a absolute area, then we do not
+ output a record. This allows us to reference absolute addresses
+ in our code, but it can still be relocated */
+
+ /* If the symbol is relative, it is within our relocatable program */
+
+ /* printf("Symbol: %s\n",s[rindex]->s_id); */
+ if ((s[rindex]->s_axp->a_bap->a_flag & A4_ABS)==0)
+ {
+ output_relocation_record=1;
+ }
+ }
+ else
+ {
+ /* If the area is absolute then we do not output a record.
+ This allows us to reference absolute memory, but still the code
+ can be relocated. */
+ /* If the area is relative, it refers to data that is part of the
+ relocatable program */
+
+ /* printf("Area: %s\n",a[rindex]->a_bap->a_id); */
+ if ((a[rindex]->a_bap->a_flag & A4_ABS)==0)
+ {
+ output_relocation_record=1;
+ }
+ }
+
+ if (output_relocation_record)
+ {
+ a_uint relocate_address = pc+(rtp-rtofst);
+ if (hilo)
+ {
+ raddr = reli + ((rtval[rtp]&0x0ff)<<8) + (rtval[rtp+1]&0x0ff);
+ }
+ else
+ {
+ raddr = reli + ((rtval[rtp+1]&0x0ff)<<8) + (rtval[rtp]&0x0ff);
+ }
+ /*printf("Relocation modify address: %04x\n",relocate_address); */
+ /*printf("Relocation address: %04x\n",raddr); */
+ if (mode & R3_BYTE)
+ {
+ if (mode & R3_BYTX)
+ {
+ if (mode & R3_MSB)
+ {
+
+relrec8hi(relocate_address,raddr);
+ }
+ else
+ {
+
+relrec8lo(relocate_address,raddr);
+ }
+ }
+ else
+ {
+ printf("not supported");
+ }
+ }
+ else
+ {
+ if (mode & R3_BYTX)
+ {
+ if (mode & R3_MSB)
+ {
+ printf("not supported");
+ }
+ else
+ {
+ printf("not supported");
+ }
+ }
+ else
+ {
+ relrec16(relocate_address);
+ }
+ }
+ }
+ }
+
+
/*
* R3_BYTE or R3_WORD operation
*/
@@ -755,6 +848,12 @@ rele3()
if (uflag != 0) {
lkulist(0);
}
+
+ /* output relocation data */
+ if (hflag) {
+ relrecwrite();
+ }
+
if (oflag != 0) {
lkflush();
lkfclose();
diff --git a/sdas/linksrc/lkrrel.c b/sdas/linksrc/lkrrel.c
new file mode 100644
index 0000000..e9e8383
--- /dev/null
+++ b/sdas/linksrc/lkrrel.c
@@ -0,0 +1,251 @@
+/* (c) Kevin Thacker, May 2005 */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "aslink.h"
+#include "lkrrel.h"
+
+struct relrechead
+{
+ int count;
+ struct relrec *head;
+};
+
+/* 16-bit values, add full 16-bit base address */
+
+static struct relrechead head16= {0,NULL};
+/* 8-bit, but add high byte of 16-bit base address */
+static struct relrechead head8hi = {0,NULL};
+/* 8-bit, but add low byte of 16-bit base address */
+static struct relrechead head8lo = {0,NULL};
+
+/* internal; free's list */
+static void relrecfree(struct relrechead *head)
+{
+ struct relrec *cur = head->head;
+
+ while (cur!=NULL)
+ {
+ struct relrec *next = cur->next;
+ free(cur);
+
+ cur = next;
+ }
+}
+
+/* free relocation record list; e.g. on exit */
+void freerelrec()
+{
+ relrecfree(&head16);
+ relrecfree(&head8hi);
+ relrecfree(&head8lo);
+}
+
+/* internal; allocate a relocation record */
+static void newrelrec(struct relrechead *head, a_uint addr, a_uint symaddr)
+{
+ struct relrec *rec;
+
+ rec = (struct relrec *) malloc(sizeof(struct relrec));
+
+ /* error if allocation failed */
+ if (rec==NULL)
+ return;
+
+ rec->addr = addr;
+ rec->symaddr = symaddr;
+
+ /* add to start of list */
+ rec->next = head->head;
+ head->head = rec;
+ head->count++;
+}
+
+/* add item to 16-bit relocation record list */
+void relrec16(a_uint addr)
+{
+ newrelrec(&head16, addr,0);
+}
+
+/* add item to 8-bit (high) relocation record list */
+void relrec8hi(a_uint addr, a_uint symaddr)
+{
+ newrelrec(&head8hi, addr,symaddr);
+}
+
+/* add address to 8-bit (low) relocation list */
+void relrec8lo(a_uint addr, a_uint symaddr)
+{
+ newrelrec(&head8lo, addr,symaddr);
+}
+
+/* internal; compare two addresses within two relocate records */
+static int relreccompare(const void *a, const void *b)
+{
+ const struct relrec *relreca = (const struct relrec *)a;
+ const struct relrec *relrecb = (const struct relrec *)b;
+
+ return (relreca->addr-relrecb->addr);
+}
+
+/* sort a list of relocate records and return an array of the records */
+static struct relrec *relrecsort(struct relrechead *head)
+{
+ int count;
+ struct relrec *reclist;
+ struct relrec *cur;
+
+ if (head->count==0)
+ return NULL;
+
+ /* allocate list to hold all items */
+ reclist = (struct relrec *)malloc(sizeof(struct relrec)*head->count);
+
+ if (reclist==NULL)
+ return NULL;
+
+ /* fill list */
+ count = 0;
+ cur = head->head;
+ while (cur!=NULL)
+ {
+ memcpy(&reclist[count],cur,sizeof(struct relrec));
+ count++;
+ cur = cur->next;
+ }
+
+ /* sort into ascending address order */
+ qsort(reclist, count, sizeof(struct relrec),relreccompare);
+
+ return reclist;
+}
+
+int outbyte(int addr, char byte)
+{
+ rtval[0] = addr&0x0ff;
+ rtval[1] = (addr>>8)&0x0ff;
+ rtval[2] = byte&0x0ff;
+ addr+=1;
+ rtflg[0] = 1;
+ rtflg[1] = 1;
+ rtflg[2] = 1;
+ rtcnt = 3;
+ ixx(1);
+ return addr;
+}
+
+void relrecwritelist1(struct relrechead *list,int *addrptr)
+{
+ int i;
+ struct relrec *relreclist;
+ int addr;
+
+ addr = *addrptr;
+
+ relreclist = relrecsort(list);
+
+ if (relreclist!=NULL)
+ {
+ int prevaddr = 0;
+ for (i=0; i<list->count; i++)
+ {
+ struct relrec *cur = &relreclist[i];
+
+ int delta = cur->addr-prevaddr;
+
+ if (delta>254)
+ {
+ int largedelta = delta-1;
+ addr = outbyte(addr,0x0ff);
+ addr = outbyte(addr,largedelta&0x0ff);
+ addr = outbyte(addr,(largedelta>>8)&0x0ff);
+ delta = 1;
+ }
+ prevaddr = cur->addr;
+ addr = outbyte(addr,delta&0x0ff);
+ }
+
+ free(relreclist);
+ }
+
+ addr = outbyte(addr, 0);
+
+ *addrptr = addr;
+
+}
+
+void relrecwritelist2(struct relrechead *list,int *addrptr)
+{
+ int i;
+ struct relrec *relreclist;
+ int addr;
+
+ addr = *addrptr;
+
+ relreclist = relrecsort(list);
+
+ if (relreclist!=NULL)
+ {
+ int prevaddr = 0;
+ for (i=0; i<list->count; i++)
+ {
+ struct relrec *cur = &relreclist[i];
+ int delta = cur->addr-prevaddr;
+ prevaddr = cur->addr;
+
+ if (delta>254)
+ {
+ int largedelta = delta-1;
+ addr = outbyte(addr,0x0ff);
+ addr = outbyte(addr,largedelta&0x0ff);
+ addr = outbyte(addr,(largedelta>>8)&0x0ff);
+ delta = 1;
+ }
+
+ addr = outbyte(addr,delta&0x0ff);
+ addr = outbyte(addr,cur->symaddr&0x0ff);
+ }
+
+ free(relreclist);
+ }
+
+ addr = outbyte(addr,0);
+
+ *addrptr = addr;
+
+}
+
+
+void relrecwrite()
+{
+ int areasize = 0;
+
+ struct area *cur = areap;
+ while (cur!=NULL)
+ {
+ areasize+=cur->a_size;
+ cur=cur->a_ap;
+ }
+
+ //printf("total length before relocation records: %04x\n",areasize);
+
+ /* re-write offset to relocation records */
+ rtval[0] = 0;
+ rtval[1] = 0;
+ rtval[2] = areasize&0x0ff;
+ rtval[3] = (areasize>>8)&0x0ff;
+ rtflg[0] = 1;
+ rtflg[1] = 1;
+ rtflg[2] = 1;
+ rtflg[3] = 1;
+ rtcnt = 4;
+ ixx(1);
+
+
+ int addr = areasize;
+
+
+ relrecwritelist1(&head16,&addr);
+ relrecwritelist1(&head8lo,&addr);
+ relrecwritelist2(&head8hi,&addr);
+}
diff --git a/sdas/linksrc/lkrrel.h b/sdas/linksrc/lkrrel.h
new file mode 100644
index 0000000..ca1cfd4
--- /dev/null
+++ b/sdas/linksrc/lkrrel.h
@@ -0,0 +1,17 @@
+/* relocation record */
+struct relrec
+{
+ /* next item */
+ struct relrec *next;
+
+ /* address of relocate */
+ a_uint addr;
+
+ a_uint symaddr;
+};
+
+void relrec16(a_uint addr);
+void relrec8lo(a_uint addr, a_uint symaddr);
+void relrec8hi(a_uint addr, a_uint symaddr);
+void freerelrec();
+void relrecwrite();
--
2.7.0
From b56f61aea4312e943ecf79e65846f55f4a83827e Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 15 Jan 2017 20:50:32 +0100
Subject: sdcpp: add missing include path
This prevents the configure script from detecting some things, and later
on the build fails.
diff --git a/support/cpp/configure.ac b/support/cpp/configure.ac
index cbf4e07..34435cb 100644
--- a/support/cpp/configure.ac
+++ b/support/cpp/configure.ac
@@ -217,7 +217,7 @@ AC_FUNC_MMAP_FILE
# We will need to find libiberty.h and ansidecl.h
saved_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/libiberty -I${srcdir}/libcpp/include"
+CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/../libiberty -I${srcdir}/libcpp/include -I${srcdir}/../sdbinutils/include"
gcc_AC_CHECK_DECLS(getenv abort strsignal errno \
malloc realloc calloc free clock, , ,[
#include "ansidecl.h"
--
2.7.0