Hi ports --
The attached diff enables hppa support for gpc. For context, gpc is
implemented on top of our old gcc-4.2.4 port, which never had hppa
support. I gleaned support from gcc-4.2.1 in base.
With this patch, gpc builds and passes Scott A. Moore's publicly
available Standard Pascal test suite.
OK?
~Brian
? gpc-hppa.diff
Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/gpc/Makefile,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile
--- Makefile 28 Feb 2019 01:52:37 -0000 1.3
+++ Makefile 15 Apr 2019 16:48:19 -0000
@@ -5,7 +5,7 @@ NOT_FOR_ARCHS = aarch64 m88k
COMMENT = GNU Pascal compiler
DISTNAME = gpc-20070904
-REVISION = 1
+REVISION = 2
CATEGORIES = lang
HOMEPAGE = https://www.gnu-pascal.de/gpc/h-index.html
Index: patches/patch-gcc_config_gcc
===================================================================
RCS file: patches/patch-gcc_config_gcc
diff -N patches/patch-gcc_config_gcc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-gcc_config_gcc 15 Apr 2019 16:48:19 -0000
@@ -0,0 +1,33 @@
+$OpenBSD$
+
+Add hppa support.
+
+Index: gcc/config.gcc
+--- gcc/config.gcc.orig
++++ gcc/config.gcc
+@@ -901,10 +901,21 @@ hppa*-*-linux* | parisc*-*-linux*)
+ tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
+ fi
+ ;;
+-# port not yet contributed.
+-#hppa*-*-openbsd*)
+-# target_cpu_default="MASK_PA_11"
+-# ;;
++hppa*-*-openbsd*)
++ target_cpu_default="MASK_PA_11"
++ tm_defines="${tm_defines} PIE_DEFAULT=1"
++ tm_file="${tm_file} dbxelf.h elfos.h openbsd.h openbsd-libpthread.h pa/openbsd.h \
++ pa/pa32-regs.h"
++ tmake_file="${tmake_file} pa/t-linux"
++ # Set the libgcc version number
++ if test x$sjlj = x1; then
++ tmake_file="$tmake_file pa/t-slibgcc-sjlj-ver"
++ else
++ tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
++ fi
++ gas=yes
++ gnu_ld=yes
++ ;;
+ hppa1.1-*-pro*)
+ target_cpu_default="MASK_PORTABLE_RUNTIME|MASK_NO_SPACE_REGS|MASK_SOFT_FLOAT"
+ tm_file="${tm_file} pa/pa32-regs.h dbxelf.h elfos.h pa/elf.h \
Index: patches/patch-gcc_config_pa_openbsd_h
===================================================================
RCS file: patches/patch-gcc_config_pa_openbsd_h
diff -N patches/patch-gcc_config_pa_openbsd_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-gcc_config_pa_openbsd_h 15 Apr 2019 16:48:19 -0000
@@ -0,0 +1,202 @@
+$OpenBSD$
+
+Add hppa support.
+
+Index: gcc/config/pa/openbsd.h
+--- gcc/config/pa/openbsd.h.orig
++++ gcc/config/pa/openbsd.h
+@@ -0,0 +1,194 @@
++/* Configuration file for an hppa risc OpenBSD target.
++
++ Copyright (C) 1999 Free Software Foundation, Inc.
++
++This file is part of GNU CC.
++
++GNU CC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2, or (at your option)
++any later version.
++
++GNU CC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GNU CC; see the file COPYING. If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA. */
++
++
++#define OBSD_HAS_DECLARE_FUNCTION_NAME
++#define OBSD_HAS_DECLARE_FUNCTION_SIZE
++#define OBSD_HAS_DECLARE_OBJECT
++
++/* Turn off various SOM crap we don't want. */
++#undef TARGET_ELF32
++#define TARGET_ELF32 1
++
++#undef MAX_OFILE_ALIGNMENT
++#define MAX_OFILE_ALIGNMENT 0x8000
++
++/* Run-time target specifications. */
++#undef TARGET_OS_CPP_BUILTINS
++#define TARGET_OS_CPP_BUILTINS() \
++ do \
++ { \
++ OPENBSD_OS_CPP_BUILTINS_ELF(); \
++ } \
++ while (0)
++
++/* We don't use profile counters. */
++#define NO_DEFERRED_PROFILE_COUNTERS 1
++
++/* Define the strings used for the special svr4 .type and .size directives.
++ These strings generally do not vary from one system running svr4 to
++ another, but if a given system (e.g. m88k running svr) needs to use
++ different pseudo-op names for these, they may be overridden in the
++ file which includes this one. */
++
++#undef STRING_ASM_OP
++#define STRING_ASM_OP "\t.stringz\t"
++
++#define TEXT_SECTION_ASM_OP "\t.text"
++#define DATA_SECTION_ASM_OP "\t.data"
++#define BSS_SECTION_ASM_OP "\t.section\t.bss"
++
++/* We want local labels to start with period if made with asm_fprintf. */
++#undef LOCAL_LABEL_PREFIX
++#define LOCAL_LABEL_PREFIX "."
++
++/* Define these to generate the Linux/ELF/SysV style of internal
++ labels all the time - i.e. to be compatible with
++ ASM_GENERATE_INTERNAL_LABEL in <elfos.h>. Compare these with the
++ ones in pa.h and note the lack of dollar signs in these. FIXME:
++ shouldn't we fix pa.h to use ASM_GENERATE_INTERNAL_LABEL instead? */
++
++#undef ASM_OUTPUT_ADDR_VEC_ELT
++#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
++ if (TARGET_BIG_SWITCH) \
++ fprintf (FILE, "\t.word .L%d\n", VALUE); \
++ else \
++ fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE)
++
++#undef ASM_OUTPUT_ADDR_DIFF_ELT
++#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
++ if (TARGET_BIG_SWITCH) \
++ fprintf (FILE, "\t.word .L%d-.L%d\n", VALUE, REL); \
++ else \
++ fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE)
++
++/* Use the default. */
++#undef ASM_OUTPUT_LABEL
++
++/* NOTE: (*targetm.asm_out.internal_label)() is defined for us by elfos.h, and
++ does what we want (i.e. uses colons). It must be compatible with
++ ASM_GENERATE_INTERNAL_LABEL(), so do not define it here. */
++
++/* Use the default. */
++#undef ASM_OUTPUT_INTERNAL_LABEL
++
++/* Use the default. */
++#undef TARGET_ASM_GLOBALIZE_LABEL
++
++/* FIXME: Hacked from the <elfos.h> one so that we avoid multiple
++ labels in a function declaration (since pa.c seems determined to do
++ it differently) */
++
++#undef ASM_DECLARE_FUNCTION_NAME
++#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
++ do \
++ { \
++ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
++ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
++ } \
++ while (0)
++
++/* As well as globalizing the label, we need to encode the label
++ to ensure a plabel is generated in an indirect call. */
++
++#undef ASM_OUTPUT_EXTERNAL_LIBCALL
++#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
++ do \
++ { \
++ if (!FUNCTION_NAME_P (XSTR (FUN, 0))) \
++ hppa_encode_label (FUN); \
++ (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)); \
++ } \
++ while (0)
++
++/* OpenBSD always uses gas. */
++#undef TARGET_GAS
++#define TARGET_GAS 1
++
++/* XXX OpenBSD/hppa has a non-standard .comm */
++
++#undef ASM_OUTPUT_ALIGNED_COMMON
++#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
++ do \
++ { \
++ switch_to_section (bss_section); \
++ assemble_name((FILE), (NAME)); \
++ fprintf((FILE), "\t.align %d\n", ((ALIGN) / BITS_PER_UNIT)); \
++ fprintf ((FILE), "\t.comm %d\n", \
++ MAX ((SIZE), ((ALIGN) / BITS_PER_UNIT))); \
++ } \
++ while (0)
++
++#undef ASM_OUTPUT_ALIGNED_LOCAL
++#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
++ do \
++ { \
++ switch_to_section (bss_section); \
++ fprintf((FILE), "\t.align %d\n", ((ALIGN) / BITS_PER_UNIT)); \
++ assemble_name((FILE), (NAME)); \
++ fprintf ((FILE), "\t.block %d\n", (SIZE)); \
++ } \
++ while (0)
++
++#undef TARGET_SCHED_DEFAULT
++#define TARGET_SCHED_DEFAULT PROCESSOR_700
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{!shared:%{!nostdlib:%{!r*:%{!e*:-e __start}}}} \
++ %{shared:-shared} %{R*} \
++ %{static:-Bstatic} \
++ %{!static:-Bdynamic} \
++ %{rdynamic:-export-dynamic} \
++ %{assert*} \
++ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.so}"
++
++/* Layout of source language data types. */
++
++/* This must agree with <machine/_types.h> */
++#undef SIZE_TYPE
++#define SIZE_TYPE "long unsigned int"
++
++#undef PTRDIFF_TYPE
++#define PTRDIFF_TYPE "long int"
++
++#undef INTMAX_TYPE
++#define INTMAX_TYPE "long long int"
++
++#undef UINTMAX_TYPE
++#define UINTMAX_TYPE "long long unsigned int"
++
++#undef WCHAR_TYPE
++#define WCHAR_TYPE "int"
++
++#undef WCHAR_TYPE_SIZE
++#define WCHAR_TYPE_SIZE 32
++
++/* As an elf system, we need crtbegin/crtend stuff. */
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC "\
++ %{!shared: %{pg:gcrt0%O%s} %{!pg:%{p:gcrt0%O%s} \
++ %{!p:%{!static:crt0%O%s} %{static:%{nopie:crt0%O%s} \
++ %{!nopie:rcrt0%O%s}}}} crtbegin%O%s} %{shared:crtbeginS%O%s}"
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
++
++#define OBSD_HAS_CORRECT_SPECS