Files
haikuports/dev-embedded/sdcc/patches/sdcc-4.2.0.patchset
PulkoMandy eb7afe26c7 SDCC: cleanup and update patchset, add debuginfo package
- Relocation patch needed some rework for SDCC 4.2
- Backport an upstream bugfix to fix a compiler crash in one of my projects
- Clean up the other parts of the patchset to prepare for upstream submission
2023-05-01 14:23:06 +02:00

717 lines
19 KiB
Plaintext

From 66447125e5dfb95c8dd070ef443c1d2f0e640e88 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:25:39 +0200
Subject: Add Haiku to sdbinutils conig.bfd
So we don't get an "unknown operating system" during build.
diff --git a/support/sdbinutils/bfd/config.bfd b/support/sdbinutils/bfd/config.bfd
index 6d34c6d..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
@@ -853,6 +857,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.37.3
From aa4c0980ba7455e3d78f31fe3998348cc98c62a6 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Sun, 14 Sep 2014 12:26:14 +0200
Subject: Missing includes.
These are not needed on Linux, but they are on Haiku
diff --git a/sim/ucsim/cmd.src/newcmdposixcl.h b/sim/ucsim/cmd.src/newcmdposixcl.h
index bba26c5..edb2db7 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 <sys/select.h>
/*
* Command fd console
diff --git a/sim/ucsim/pobj.cc b/sim/ucsim/pobj.cc
index 84d8861..cbe486d 100644
--- a/sim/ucsim/pobj.cc
+++ b/sim/ucsim/pobj.cc
@@ -33,6 +33,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.37.3
From f442eebd423e92de5acb950fd58c74b0459efd6c 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
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.37.3
From dd799e32d1e14eaebba8c6c6a91615f24695f8aa Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Fri, 22 Jan 2016 21:01:19 +0100
Subject: Kevin Thacker's patch for runtime relocation support.
This patch is used to build the Contiki operating system for Z80
machines.
This version is modified for SDCC 4.2, the addresses are now internally
stored on 24 bits instead of 16 bits (to help support banked code), and
the code in the patch was adjusted for that.
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 94c2b7b..f898a19 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 169e8c1..8686631 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 daf5515..d690d46 100644
--- a/sdas/linksrc/lkmain.c
+++ b/sdas/linksrc/lkmain.c
@@ -212,6 +212,7 @@ main(int argc, char *argv[])
startp->f_idp = "";
pflag = 1;
+ hflag = 0;
for(i=1; i<argc; i++) {
ip = ib;
@@ -979,6 +980,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 b330184..0a83e0f 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,93 @@ 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);
+ }
+ }
+ }
+ }
/* 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..0d9f943
--- /dev/null
+++ b/sdas/linksrc/lkrrel.c
@@ -0,0 +1,256 @@
+/* (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] = (addr>>16)&0x0ff;
+
+ rtval[3] = byte&0x0ff;
+ addr+=1;
+ rtflg[0] = 1;
+ rtflg[1] = 1;
+ rtflg[2] = 1;
+ rtflg[3] = 1;
+ rtcnt = 4;
+ 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] = 0;
+ rtval[3] = areasize&0x0ff;
+ rtval[4] = (areasize>>8)&0x0ff;
+ rtflg[0] = 1;
+ rtflg[1] = 1;
+ rtflg[2] = 1;
+ rtflg[3] = 1;
+ rtflg[4] = 1;
+ rtcnt = 5;
+ 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.37.3
From 02b6fcf8a92f183f742e1a55ab579dcd40ba1bdf Mon Sep 17 00:00:00 2001
From: PulkoMandy <pulkomandy@pulkomandy.tk>
Date: Mon, 1 May 2023 12:21:48 +0200
Subject: configure.ac: use -gdwarf-3 instead of -ggdb
This works better with Haiku's Debugger
diff --git a/configure.ac b/configure.ac
index cc5309e..7d3d1b8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -388,10 +388,10 @@ if test "$ac_cv_c_compiler_gnu" = "yes"; then
rm -f _test_.*)
# This is the first time when CFLAGS are set/modified!!
- sdcc_IS_VALID_OPTION(-ggdb)
- if test "$sdcc_cv_c_ggdb" = "yes"; then
- CFLAGS="-ggdb ${CFLAGS}"
- CXXFLAGS="-ggdb ${CXXFLAGS}"
+ sdcc_IS_VALID_OPTION(-gdwarf-3)
+ if test "$sdcc_cv_c_gdwarf_3" = "yes"; then
+ CFLAGS="-gdwarf-3 ${CFLAGS}"
+ CXXFLAGS="-gdwarf-3 ${CXXFLAGS}"
fi
sdcc_IS_VALID_OPTION(-pipe)
--
2.37.3
From 970de68df98a204b81aa1eacd33ca24a9a1be6eb Mon Sep 17 00:00:00 2001
From: PulkoMandy <pulkomandy@pulkomandy.tk>
Date: Mon, 1 May 2023 12:23:55 +0200
Subject: Do not strip binaries when installing them
This is done already by Haiku packaging when creating the debuginfo
package.
diff --git a/sdas/linksrc/Makefile.in b/sdas/linksrc/Makefile.in
index e37b167..7e7f9ea 100644
--- a/sdas/linksrc/Makefile.in
+++ b/sdas/linksrc/Makefile.in
@@ -87,28 +87,22 @@ $(ASLINK): $(LKOBJECTS)
# ----------------------------------------------------
install: all installdirs
$(INSTALL) $(top_builddir)/bin/sdld$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdld' | sed '$(transform)'`$(EXEEXT)
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdld' | sed '$(transform)'`$(EXEEXT)
if [ "`grep stm8 $(top_builddir)/ports.build`" = "stm8" ]; \
then \
$(INSTALL) $(top_builddir)/bin/sdldstm8$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdldstm8' | sed '$(transform)'`$(EXEEXT); \
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdldstm8' | sed '$(transform)'`$(EXEEXT); \
fi
if [ "`grep hc08 $(top_builddir)/ports.build`" = "hc08" ]; \
then \
$(INSTALL) $(top_builddir)/bin/sdld6808$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdld6808' | sed '$(transform)'`$(EXEEXT); \
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdld6808' | sed '$(transform)'`$(EXEEXT); \
fi
if [ "`grep z80 $(top_builddir)/ports.build`" = "z80" ]; \
then \
$(INSTALL) $(top_builddir)/bin/sdldz80$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdldz80' | sed '$(transform)'`$(EXEEXT); \
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdldz80' | sed '$(transform)'`$(EXEEXT); \
$(INSTALL) $(top_builddir)/bin/sdldgb$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdldgb' | sed '$(transform)'`$(EXEEXT); \
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdldgb' | sed '$(transform)'`$(EXEEXT); \
fi
if [ "`grep pdk $(top_builddir)/ports.build`" = "pdk" ]; \
then \
$(INSTALL) $(top_builddir)/bin/sdldpdk$(EXEEXT) $(DESTDIR)$(bindir)/`echo 'sdldpdk' | sed '$(transform)'`$(EXEEXT); \
- $(STRIP) $(DESTDIR)$(bindir)/`echo 'sdldpdk' | sed '$(transform)'`$(EXEEXT); \
fi
# Deleting all the installed files
diff --git a/src/Makefile.in b/src/Makefile.in
index 1533d1f..8f2c2c6 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -69,7 +69,6 @@ $(top_builddir)/support/gc/libgc.a:
# ---------------------------------------------------
install: all installdirs
$(INSTALL) $(TARGET) $(DESTDIR)$(bindir)/`echo sdcc|sed '$(transform)'`$(EXEEXT)
- $(STRIP) $(DESTDIR)$(bindir)/`echo sdcc|sed '$(transform)'`$(EXEEXT)
# Deleting all the installed files
--
2.37.3
From ed45ed6c696d9f250c427d65379ddd1d7e37c52c Mon Sep 17 00:00:00 2001
From: PulkoMandy <pulkomandy@pulkomandy.tk>
Date: Mon, 1 May 2023 14:19:47 +0200
Subject: Backport upstream bugfix r13588
Fix for https://sourceforge.net/p/sdcc/bugs/3401
diff --git a/src/SDCCast.c b/src/SDCCast.c
index 04f2cc1..1dab15c 100644
--- a/src/SDCCast.c
+++ b/src/SDCCast.c
@@ -4060,10 +4060,11 @@ decorateType (ast *tree, RESULT_TYPE resultType, bool reduceTypeAllowed)
if (reduceTypeAllowed &&
IS_LITERAL (RTYPE (tree)) &&
IS_BOOLEAN (LTYPE (tree)) &&
- IS_INTEGRAL (RTYPE (tree)) &&
+ IS_AST_LIT_VALUE (tree->right) &&
resultType == RESULT_TYPE_BOOL &&
tree->opval.op == '^') /* the same source is used by 'bitwise or' */
{
+ wassert (tree->right->type == EX_VALUE);
unsigned long litval = AST_ULONG_VALUE (tree->right);
if (litval == 0 || litval == 1)
{
@@ -4077,11 +4078,11 @@ decorateType (ast *tree, RESULT_TYPE resultType, bool reduceTypeAllowed)
return decorateType (tree, resultType, reduceTypeAllowed);
}
}
-
+
/* OR / XOR char with literal integral, try to reduce integral to CHAR if it fits in a CHAR */
if (reduceTypeAllowed &&
!TARGET_PDK_LIKE && // Temporary fix to avoid bug #3259 - Wrong opcodes
- IS_LITERAL (RTYPE (tree)) &&
+ IS_AST_LIT_VALUE (tree->right) &&
IS_INTEGRAL (RTYPE (tree)) &&
!IS_CHAR (RTYPE (tree)) &&
IS_CHAR(LTYPE(tree)))
--
2.37.3