mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
Merge pull request #649 from DrDoof/build/sdcc-in-tree
build: build SDCC 4.6.0 with the mcs51 fixes in the tree
This commit is contained in:
10 files changed
+237
-9
No files matched your search
@@ -3,6 +3,7 @@
|
|||||||
.gitattributes
|
.gitattributes
|
||||||
.github/
|
.github/
|
||||||
output/
|
output/
|
||||||
|
toolchain/
|
||||||
installer/output/
|
installer/output/
|
||||||
*.bin
|
*.bin
|
||||||
html_data.c
|
html_data.c
|
||||||
|
|||||||
@@ -29,7 +29,12 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
apt update
|
apt update
|
||||||
apt install make gcc sdcc xxd python-is-python3 libjson-c-dev zlib1g-dev -y
|
apt install make gcc g++ bison flex libboost-dev patch bzip2 curl ca-certificates xxd python-is-python3 libjson-c-dev zlib1g-dev -y
|
||||||
|
- name: Cache the patched SDCC
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: branch/toolchain
|
||||||
|
key: sdcc-${{ hashFiles('branch/sdcc/*') }}
|
||||||
- name: Run the host-side unit tests
|
- name: Run the host-side unit tests
|
||||||
run: cd branch && make -C test
|
run: cd branch && make -C test
|
||||||
- name: Check that every machine definition can be compiled
|
- name: Check that every machine definition can be compiled
|
||||||
@@ -41,7 +46,10 @@ jobs:
|
|||||||
- name: Make project with the health instrumentation
|
- name: Make project with the health instrumentation
|
||||||
run: cd branch && make clean && make CI=1 MACHINE="KP_9000_6XHML_X2" HEALTH=1
|
run: cd branch && make clean && make CI=1 MACHINE="KP_9000_6XHML_X2" HEALTH=1
|
||||||
- name: Make main
|
- name: Make main
|
||||||
run: cd main && make CI=1 MACHINE="KP_9000_6XHML_X2" && cp output/KP_9000_6XHML_X2/rtlplayground.map /tmp/main.map
|
run: |
|
||||||
|
ln -s ../branch/toolchain main/toolchain
|
||||||
|
PATH="$(echo "$PWD"/branch/toolchain/sdcc-*/bin):$PATH"
|
||||||
|
cd main && make CI=1 MACHINE="KP_9000_6XHML_X2" && cp output/KP_9000_6XHML_X2/rtlplayground.map /tmp/main.map
|
||||||
- name: Calculate bank growth
|
- name: Calculate bank growth
|
||||||
run: |
|
run: |
|
||||||
sed -rn 's/^([XCD]SEG|(BANK[0-9])).*=\s+([0-9]+)\. bytes.*$/MAIN_\1=\3/p' /tmp/main.map | sort -u >> "$GITHUB_ENV"
|
sed -rn 's/^([XCD]SEG|(BANK[0-9])).*=\s+([0-9]+)\. bytes.*$/MAIN_\1=\3/p' /tmp/main.map | sort -u >> "$GITHUB_ENV"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
.idea/
|
.idea/
|
||||||
output/
|
output/
|
||||||
output-main/
|
output-main/
|
||||||
|
toolchain/
|
||||||
html_data.c
|
html_data.c
|
||||||
html_data.h
|
html_data.h
|
||||||
version.h
|
version.h
|
||||||
|
|||||||
+8
-1
@@ -3,7 +3,14 @@ FROM debian:13-slim
|
|||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
make \
|
make \
|
||||||
gcc \
|
gcc \
|
||||||
sdcc \
|
g++ \
|
||||||
|
bison \
|
||||||
|
flex \
|
||||||
|
libboost-dev \
|
||||||
|
patch \
|
||||||
|
bzip2 \
|
||||||
|
curl \
|
||||||
|
ca-certificates \
|
||||||
xxd \
|
xxd \
|
||||||
python3 \
|
python3 \
|
||||||
libjson-c-dev \
|
libjson-c-dev \
|
||||||
|
|||||||
@@ -4,8 +4,11 @@ DEFAULT_CONFIG_LOCATION = 454656
|
|||||||
CONFIG_LOCATION = 458752
|
CONFIG_LOCATION = 458752
|
||||||
HTML_LOCATION = 262144
|
HTML_LOCATION = 262144
|
||||||
|
|
||||||
|
SDCC_PREFIX = toolchain/sdcc-$(shell cat sdcc/* | cksum | cut -d' ' -f1)
|
||||||
ifeq ($(origin CC),default)
|
ifeq ($(origin CC),default)
|
||||||
CC = sdcc
|
SDCC = $(SDCC_PREFIX)/bin/sdcc
|
||||||
|
CC = $(SDCC)
|
||||||
|
ASM = $(SDCC_PREFIX)/bin/sdas8051
|
||||||
endif
|
endif
|
||||||
CC_FLAGS = -mmcs51 -I. -Imachine -Ihttpd -Iuip
|
CC_FLAGS = -mmcs51 -I. -Imachine -Ihttpd -Iuip
|
||||||
ASM ?= sdas8051
|
ASM ?= sdas8051
|
||||||
@@ -72,7 +75,7 @@ all: create_build_dir $(VERSION_HEADER) $(MACHINE_SRC) $(SUBDIRS) $(BUILDDIR)/rt
|
|||||||
bank_size:
|
bank_size:
|
||||||
tools/bank_occupancy.sh "$(MACHINE)"
|
tools/bank_occupancy.sh "$(MACHINE)"
|
||||||
|
|
||||||
create_build_dir:
|
create_build_dir: $(SDCC)
|
||||||
mkdir -p "$(BUILDDIR)"
|
mkdir -p "$(BUILDDIR)"
|
||||||
mkdir -p "$(BUILDDIR)/uip"
|
mkdir -p "$(BUILDDIR)/uip"
|
||||||
mkdir -p "$(BUILDDIR)/httpd"
|
mkdir -p "$(BUILDDIR)/httpd"
|
||||||
@@ -175,6 +178,12 @@ clean: $(SUBDIRSCLEAN)
|
|||||||
distclean: $(SUBDIRSCLEAN)
|
distclean: $(SUBDIRSCLEAN)
|
||||||
-rm -f html_data.c html_data.h $(VERSION_HEADER)
|
-rm -f html_data.c html_data.h $(VERSION_HEADER)
|
||||||
-rm -rf $(BUILDDIR)
|
-rm -rf $(BUILDDIR)
|
||||||
|
-rm -rf toolchain
|
||||||
|
|
||||||
|
ifneq ($(SDCC),)
|
||||||
|
$(SDCC):
|
||||||
|
sh sdcc/build.sh $(abspath $(SDCC_PREFIX))
|
||||||
|
endif
|
||||||
|
|
||||||
$(SUBDIRSCLEAN):
|
$(SUBDIRSCLEAN):
|
||||||
$(MAKE) -C $(@:clean=) clean
|
$(MAKE) -C $(@:clean=) clean
|
||||||
@@ -223,7 +232,7 @@ MACHINE_DEFS := $(sort $(patsubst machine/%.c,%,$(filter-out machine/%_init.c,$(
|
|||||||
MACHINE_LESS_CC_FLAGS = $(filter-out -DMACHINE_%,$(CC_FLAGS))
|
MACHINE_LESS_CC_FLAGS = $(filter-out -DMACHINE_%,$(CC_FLAGS))
|
||||||
|
|
||||||
.PHONY: machine_check
|
.PHONY: machine_check
|
||||||
machine_check:
|
machine_check: $(SDCC)
|
||||||
@mkdir -p $(BUILDDIR)/tmp
|
@mkdir -p $(BUILDDIR)/tmp
|
||||||
@set -eo pipefail; \
|
@set -eo pipefail; \
|
||||||
for MACHINE in $(MACHINE_DEFS); \
|
for MACHINE in $(MACHINE_DEFS); \
|
||||||
|
|||||||
@@ -56,12 +56,19 @@ device simulator is provided, which runs entirely under Linux as a local webserv
|
|||||||
|
|
||||||
## (0) Compiling Requirements
|
## (0) Compiling Requirements
|
||||||
|
|
||||||
Install the following particular build requisites (Debian 12/13), note that Ubuntu 24.04
|
Install the following particular build requisites (Debian 12/13):
|
||||||
still has an older version of sdcc, but you will need sdcc version 4.5 for the code to compile:
|
|
||||||
```
|
```
|
||||||
sudo apt install make gcc sdcc xxd python-is-python3 libjson-c-dev zlib1g-dev
|
sudo apt install make gcc g++ bison flex libboost-dev patch bzip2 curl xxd python-is-python3 libjson-c-dev zlib1g-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The first `make` downloads SDCC 4.6.0, applies the fixes in `sdcc/` and builds it into
|
||||||
|
`toolchain/`, which takes a few minutes. Later builds reuse it. The released SDCC 4.5.0
|
||||||
|
and 4.6.0 miscompile parts of this code, see [SDCC bug #4153](https://sourceforge.net/p/sdcc/bugs/4153/)
|
||||||
|
and [#4154](https://sourceforge.net/p/sdcc/bugs/4154/); both fixes are in SDCC trunk since
|
||||||
|
r17039. The third patch is for [#4070](https://sourceforge.net/p/sdcc/bugs/4070/), where the
|
||||||
|
assembler drops the top byte of a `__sfr32` address list; it is proposed upstream and lets
|
||||||
|
`SFR_DATA_U32` be used again. To use an SDCC you installed yourself instead, run `make CC=sdcc ...`.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>If using Docker (click to expand)</summary>
|
<summary>If using Docker (click to expand)</summary>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
https://sourceforge.net/p/sdcc/bugs/4153/
|
||||||
|
|
||||||
|
Index: src/mcs51/ralloc.c
|
||||||
|
===================================================================
|
||||||
|
--- src/mcs51/ralloc.c (revision 17011)
|
||||||
|
+++ src/mcs51/ralloc.c (working copy)
|
||||||
|
@@ -1208,7 +1208,7 @@
|
||||||
|
int change = 0;
|
||||||
|
|
||||||
|
/* if the result has been spilt then cannot share */
|
||||||
|
- if (opsym->isspilt)
|
||||||
|
+ if (result->isspilt || opsym->isspilt)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
https://sourceforge.net/p/sdcc/bugs/4154/
|
||||||
|
|
||||||
|
Index: src/mcs51/ralloc.c
|
||||||
|
===================================================================
|
||||||
|
--- src/mcs51/ralloc.c (revision 17011)
|
||||||
|
+++ src/mcs51/ralloc.c (working copy)
|
||||||
|
@@ -641,6 +641,7 @@
|
||||||
|
spillThis (symbol * sym)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
+ bool ownsRegs = bitVectBitValue (_G.regAssigned, sym->key);
|
||||||
|
/* if this is rematerializable or has a spillLocation
|
||||||
|
we are okay, else we need to create a spillLocation
|
||||||
|
for it */
|
||||||
|
@@ -658,7 +659,8 @@
|
||||||
|
{
|
||||||
|
if (sym->regs[i])
|
||||||
|
{
|
||||||
|
- freeReg (sym->regs[i]);
|
||||||
|
+ if (ownsRegs)
|
||||||
|
+ freeReg (sym->regs[i]);
|
||||||
|
sym->regs[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
https://sourceforge.net/p/sdcc/bugs/4070/
|
||||||
|
|
||||||
|
Index: sdas/asxxsrc/asexpr.c
|
||||||
|
===================================================================
|
||||||
|
--- sdas/asxxsrc/asexpr.c
|
||||||
|
+++ sdas/asxxsrc/asexpr.c
|
||||||
|
@@ -863,18 +863,59 @@
|
||||||
|
return((n & s_mask) ? (n | ~v_mask) : (n & v_mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*)Function void exprmasks(esp)
|
||||||
|
+/*)Function void exprmasks(n)
|
||||||
|
*
|
||||||
|
* int n T Line Bytes in Address
|
||||||
|
*
|
||||||
|
* The function exprmasks() configures the assembler
|
||||||
|
- * for 16, 24, or 32-Bit Data/Addresses.
|
||||||
|
+ * for 16, 24, or 32-Bit Data/Addresses. The arithmetic
|
||||||
|
+ * precision follows the address width unless a port
|
||||||
|
+ * calls valmasks() afterwards.
|
||||||
|
*
|
||||||
|
* local variables:
|
||||||
|
* none
|
||||||
|
*
|
||||||
|
* global variables:
|
||||||
|
* int a_bytes T Line Bytes in Address
|
||||||
|
+ *
|
||||||
|
+ * functions called:
|
||||||
|
+ * void valmasks() asexpr.c
|
||||||
|
+ *
|
||||||
|
+ * side effects:
|
||||||
|
+ * The address width and arithmetic precision
|
||||||
|
+ * parameters are set.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+exprmasks(int n)
|
||||||
|
+{
|
||||||
|
+ switch(n) {
|
||||||
|
+ default:
|
||||||
|
+ n = 2;
|
||||||
|
+ case 2:
|
||||||
|
+ case 3:
|
||||||
|
+ case 4:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ a_bytes = n;
|
||||||
|
+ valmasks(n);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*)Function void valmasks(n)
|
||||||
|
+ *
|
||||||
|
+ * int n Bytes of arithmetic precision
|
||||||
|
+ *
|
||||||
|
+ * The function valmasks() configures the 16, 24, or
|
||||||
|
+ * 32-Bit arithmetic precision independently of the
|
||||||
|
+ * T Line address width. A port whose addresses fit
|
||||||
|
+ * in 24 bits but whose symbols may hold 32-bit values
|
||||||
|
+ * (the 8051 __sfr32 address lists, for example) uses
|
||||||
|
+ * exprmasks(3) followed by valmasks(4).
|
||||||
|
+ *
|
||||||
|
+ * local variables:
|
||||||
|
+ * none
|
||||||
|
+ *
|
||||||
|
+ * global variables:
|
||||||
|
* a_uint a_mask Address mask
|
||||||
|
* a_uint s_mask Sign mask
|
||||||
|
* a_uint v_mask Value mask
|
||||||
|
@@ -885,16 +926,13 @@
|
||||||
|
* side effects:
|
||||||
|
* The arithmetic precision parameters are set.
|
||||||
|
*/
|
||||||
|
-
|
||||||
|
+
|
||||||
|
void
|
||||||
|
-exprmasks(int n)
|
||||||
|
+valmasks(int n)
|
||||||
|
{
|
||||||
|
- a_bytes = n;
|
||||||
|
-
|
||||||
|
#ifdef LONGINT
|
||||||
|
- switch(a_bytes) {
|
||||||
|
+ switch(n) {
|
||||||
|
default:
|
||||||
|
- a_bytes = 2;
|
||||||
|
case 2:
|
||||||
|
a_mask = (a_uint) 0x0000FFFFl;
|
||||||
|
s_mask = (a_uint) 0x00008000l;
|
||||||
|
@@ -914,9 +952,8 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
- switch(a_bytes) {
|
||||||
|
+ switch(n) {
|
||||||
|
default:
|
||||||
|
- a_bytes = 2;
|
||||||
|
case 2:
|
||||||
|
a_mask = (a_uint) 0x0000FFFF;
|
||||||
|
s_mask = (a_uint) 0x00008000;
|
||||||
|
Index: sdas/asxxsrc/asxxxx.h
|
||||||
|
===================================================================
|
||||||
|
--- sdas/asxxsrc/asxxxx.h
|
||||||
|
+++ sdas/asxxsrc/asxxxx.h
|
||||||
|
@@ -1354,6 +1354,7 @@
|
||||||
|
extern int digit(int c, int r);
|
||||||
|
extern int is_digit(int c, int r);
|
||||||
|
extern void exprmasks(int n);
|
||||||
|
+extern void valmasks(int n);
|
||||||
|
extern void expr(struct expr *esp, int n);
|
||||||
|
extern void binop(int c, struct expr *esp, struct expr *re);
|
||||||
|
extern int is_abs(struct expr *esp);
|
||||||
|
Index: sdas/as8051/i51mch.c
|
||||||
|
===================================================================
|
||||||
|
--- sdas/as8051/i51mch.c
|
||||||
|
+++ sdas/as8051/i51mch.c
|
||||||
|
@@ -782,9 +782,12 @@
|
||||||
|
hilo = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Address Space
|
||||||
|
+ * Address Space: 24-bit addresses in the T lines,
|
||||||
|
+ * 32-bit arithmetic so that __sfr32 address lists
|
||||||
|
+ * like 0xa4a5a6a7 keep their most significant byte.
|
||||||
|
*/
|
||||||
|
- exprmasks(3);
|
||||||
|
+ exprmasks(3);
|
||||||
|
+ valmasks(4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First time only:
|
||||||
Executable
+26
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
V=4.6.0
|
||||||
|
SHA=5fd6a93e5997ce01756868fe35e441095cfb637894a80c262514a634094973b6
|
||||||
|
PREFIX=$1
|
||||||
|
D=$(cd "$(dirname "$0")" && pwd)
|
||||||
|
W=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$W"' EXIT
|
||||||
|
curl -fL -o "$W/sdcc.tar.bz2" "https://downloads.sourceforge.net/project/sdcc/sdcc/$V/sdcc-src-$V.tar.bz2"
|
||||||
|
if command -v sha256sum >/dev/null; then
|
||||||
|
echo "$SHA $W/sdcc.tar.bz2" | sha256sum -c -
|
||||||
|
else
|
||||||
|
echo "$SHA $W/sdcc.tar.bz2" | shasum -a 256 -c -
|
||||||
|
fi
|
||||||
|
tar -C "$W" -xjf "$W/sdcc.tar.bz2"
|
||||||
|
cd "$W/sdcc-$V"
|
||||||
|
for p in "$D"/*.patch; do
|
||||||
|
patch -p0 < "$p"
|
||||||
|
done
|
||||||
|
off=""
|
||||||
|
for p in z80 z180 r2k r2ka r3ka r4k r5k r6k sm83 tlcs90 ez80 ez80_z80 z80n r800 ds390 ds400 pic14 pic16 hc08 s08 stm8 pdk13 pdk14 pdk15 mos6502 mos65c02 huc6280 f8 f8l; do
|
||||||
|
off="$off --disable-$p-port"
|
||||||
|
done
|
||||||
|
./configure --prefix="$PREFIX" $off --disable-sdcdb --disable-ucsim --disable-non-free
|
||||||
|
make -j"$(getconf _NPROCESSORS_ONLN)"
|
||||||
|
make install
|
||||||
Reference in new issue
Block a user