From 6ade5ccbf490006eb588551ed45d283b11348737 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 17 Dec 2020 19:09:19 +0100 Subject: [PATCH] sdcc: fix patchset The patch to handle relocatable executables had been misapplied. --- .../sdcc/patches/sdcc_x86-4.0.0.patchset | 598 ++++++++++++++++++ dev-embedded/sdcc/sdcc-4.0.0.recipe | 2 +- 2 files changed, 599 insertions(+), 1 deletion(-) create mode 100644 dev-embedded/sdcc/patches/sdcc_x86-4.0.0.patchset diff --git a/dev-embedded/sdcc/patches/sdcc_x86-4.0.0.patchset b/dev-embedded/sdcc/patches/sdcc_x86-4.0.0.patchset new file mode 100644 index 000000000..8c4bdc644 --- /dev/null +++ b/dev-embedded/sdcc/patches/sdcc_x86-4.0.0.patchset @@ -0,0 +1,598 @@ +From 829667eafa493858c979f9f7e8ff23d07f80289c Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +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 6d34c6d..5ae2396 100644 +--- a/support/sdbinutils/bfd/config.bfd ++++ b/support/sdbinutils/bfd/config.bfd +@@ -853,6 +853,9 @@ case "${targ}" in + targ_defvec=i386_elf32_vec + targ_selvecs="iamcu_elf32_vec 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.28.0 + + +From a0d0065ff28aa8b5821aaa4656c8cbebc01d0a48 Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +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 b76fa1f..f6ba7d4 100644 +--- a/sim/ucsim/cmd.src/newcmdposixcl.h ++++ b/sim/ucsim/cmd.src/newcmdposixcl.h +@@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA + #include "newcmdcl.h" + #include "cmdutil.h" + ++#include + + /* + * Command fd console +-- +2.28.0 + + +From b38fb6711fbdf9cd381346848227e3e8ccb6d347 Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +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 dbf8d84..16775a2 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 + #include ++#include + + #include "pstr.h" + /*#include "pobjt.h"*/ +-- +2.28.0 + + +From 30925c99d430b10611c0617858f316221cdac777 Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +Date: Sun, 15 Jan 2017 20:50:32 +0100 +Subject: sdcpp: add missing include path + + +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.28.0 + + +From dd2c3f9e753ef4b48b9ebe3f78eb0ccb0a8b3389 Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Wed, 30 Sep 2020 19:00:21 +1000 +Subject: Add x64 support + + +diff --git a/support/sdbinutils/bfd/config.bfd b/support/sdbinutils/bfd/config.bfd +index 5ae2396..52c91b0 100644 +--- a/support/sdbinutils/bfd/config.bfd ++++ b/support/sdbinutils/bfd/config.bfd +@@ -811,6 +811,10 @@ case "${targ}" in + want64=true + targ_underscore=no + ;; ++ x86_64-*-haiku*) ++ targ_defvec=x86_64_elf64_vec ++ want64=true ++ ;; + x86_64-*-rdos*) + targ_defvec=x86_64_elf64_vec + want64=true +-- +2.28.0 + + +From 64c8f32ebb624c1b58a0ab5683eed7577d38a29d Mon Sep 17 00:00:00 2001 +From: Adrien Destugues +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 43e16f5..e37b167 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 ebad061..7dce058 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 e03cd6a..db7c8ff 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 fcf7242..5535b95 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; is_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); ++ } ++ } ++ } ++ } + + /* pdk instruction fusion */ + if (TARGET_IS_PDK) { +@@ -856,6 +947,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 ++#include ++#include ++#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; icount; 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; icount; 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.28.0 + diff --git a/dev-embedded/sdcc/sdcc-4.0.0.recipe b/dev-embedded/sdcc/sdcc-4.0.0.recipe index dcd43fc69..20130b87f 100644 --- a/dev-embedded/sdcc/sdcc-4.0.0.recipe +++ b/dev-embedded/sdcc/sdcc-4.0.0.recipe @@ -9,7 +9,7 @@ other microprocessors." HOMEPAGE="http://sdcc.sourceforge.net" COPYRIGHT="1999-2020 Sandeep Dutta" LICENSE="GNU GPL v2" -REVISION="1" +REVISION="2" SOURCE_URI="http://sourceforge.net/projects/sdcc/files/sdcc/$portVersion/sdcc-src-$portVersion.tar.bz2" CHECKSUM_SHA256="489180806fc20a3911ba4cf5ccaf1875b68910d7aed3f401bbd0695b0bef4e10" PATCHES="sdcc-$portVersion.patchset"