Paul Edwards wrote: > So, given the scope below, can someone please explain what > 4.4 changes are affecting me and what I need to do to overcome > them? Note that I have never had to do the machine changes > myself - in the past I simply waiting for Dave Pitts to do the > upgrade to the new version, and then with a working 370 code > generator I would make all the changes necessary for MVS.
Most of the things seem just minor changes, e.g. "warning" got another argument, or target macros were replaced by targetm callbacks. I can see one significant change: the GCC middle-end now no longer supports base-16 floating point at all. The old i370 port was the only user of this feature, and some time after the port was removed, the middle-end support was removed as well in order to simplify floating-point handling code. The s390 port uses IEEE float instead of hex float throughout, so it is not affected by this change. > + i370-*-mvspdp) > + xm_defines='POSIX' # 'FATAL_EXIT_CODE=12' > + xm_file="i370/xm-mvs.h" > + tm_file="i370/mvspdp.h i370/i370.h" > + tmake_file="i370/t-mvs i370/t-i370" > + c_target_objs="i370-c.o" > + cxx_target_objs="i370-c.o" > + ;; > + s390-*-linux*) > + tm_file="s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h" > + tmake_file="${tmake_file} t-dfprules s390/t-crtstuff s390/t-linux" > + ;; The s390 lines should not be added here. > ! /* +++ c_lex has gone. however, we don't use it for anything important > anyway */ > ! #define c_lex(a) Pragma handlers are now apparently supposed to use "pragma_lex" instead, which is declared in the c-pragma.h header. See e.g. config/sol2-c.c for examples of pragma handlers. > /* We're 370 floating point, not IEEE floating point. */ > memset (real_format_for_mode, 0, sizeof real_format_for_mode); > ! REAL_MODE_FORMAT (SFmode) = &i370_single_format; > ! REAL_MODE_FORMAT (DFmode) = &i370_double_format; This is a problem, see above. > /* We're 370 floating point, not IEEE floating point. */ > memset (real_format_for_mode, 0, sizeof real_format_for_mode); > ! /*REAL_MODE_FORMAT (SFmode) = &i370_single_format; > ! REAL_MODE_FORMAT (DFmode) = &i370_double_format;*/ > ! /* +++ this is wrong */ > ! REAL_MODE_FORMAT (SFmode) = &ibm_extended_format; > ! REAL_MODE_FORMAT (DFmode) = &ibm_extended_format; ibm_extended_format is certainly wrong here; that's the 64 + 64 "long double" format used on PowerPC. > for (note = REG_NOTES (insn); note; note = XEXP(note,1)) > { > + /* +++ what is reg_label? */ > + /* > if (REG_LABEL == REG_NOTE_KIND(note)) > { Instead of REG_LABEL notes, the middle-end now generates two different kinds of notes, REG_LABEL_TARGET and REG_LABEL_OPERAND. REG_LABEL_TARGET is used in JUMP_INSNs to refer to a potential target of this jump. REG_LABEL_OPERAND is used in other insns to denote labels that are used otherwise, e.g. to load the address into a register. In the context of this code in i370.c, it would appear you're concerned about the second type of usage here. This means the REG_LABEL should probably simply be replaced by REG_LABEL_OPERAND. > *************** > *** 1568,1574 **** > fprintf (f, "* Function %.*s prologue: stack = %ld, args = %d\n", > nlen, mvs_function_name, > l, > ! current_function_outgoing_args_size); > #endif current_function_outgoing_args_size must be replaced by crtl->outgoing_args_size throughout. There was no change in semantics, just where the value is stored. > fprintf (f, "* Function %.*s prologue: stack = %ld, args = %d\n", > nlen, mvs_function_name, > l, > ! 0 /*cfun->machine->frame_size*/); > #endif The cfun->machine->frame_size stuff does not seem correct here; use crtl->outgoing_args_size. > + #if 0 > + This unused (in mvspdp) stuff is now poisoned > /* Macro to define tables used to set the flags. This is a list in braces > of pairs in braces, each pair being { "NAME", VALUE } > where VALUE is the bits to set or minus the bits to clear. > *************** > *** 99,104 **** > --- 101,107 ---- > { "pickax", 2, "Experimental i370 PIC"}, \ > { "no-pickax", -2, "Disable experimental i370 PIC"}, \ > { "", TARGET_DEFAULT, 0} } > + #endif Command line options are now defined in a .opt file. If you want to keep those extra options, you should provide a config/i370/i370.opt file. See any of the other targets for examples. > + #if 0 /* +++ now poisoned */ > #define PREDICATE_CODES \ > {"r_or_s_operand", { REG, SUBREG, MEM }}, \ > {"s_operand", { MEM }}, > + #endif Predicates must now be defined in a predicates.md file. Again, see other targets for examples. > ! #if 0 /*def TARGET_PDPMAC*/ > ! +++ this variable is now poisoned - check structs still get returned > ! properly > #define STRUCT_VALUE_REGNUM 0 > ! #elif 0 /*used to be else*/ > #define STRUCT_VALUE_REGNUM 1 > #endif If something except the default is needed here, you now have to use the TARGET_STRUCT_VALUE_RTX targetm callback. > /* For an arg passed partly in registers and partly in memory, this is the > number of registers used. For args passed entirely in registers or > entirely in memory, zero. */ > ! /* +++ now poisoned */ > ! #if 0 > #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 > + #endif If something except the default is needed here, you now have to use the TARGET_ARG_PARTIAL_BYTES targetm callback. > /* This macro definition sets up a default value for `main' to return. */ > ! /* +++ now poisoned */ > ! #if 0 > #define DEFAULT_MAIN_RETURN c_expand_return (integer_zero_node) > ! #endif This is no longer supported. C99 allows omitting the main return value by default; in C89 this is not possible any longer. > /* When a prototype says `char' or `short', really pass an `int'. */ > ! /* +++ now poisoned */ > ! #if 0 > #define PROMOTE_PROTOTYPES 1 > + #endif If something except the default is needed here, you now have to use the TARGET_PROMOTE_PROTOTYPES targetm callback. > - #ifdef TARGET_EBCDIC > - #define TARGET_ESC 39 > - #define TARGET_BELL 47 > - #define TARGET_BS 22 > - #define TARGET_TAB 5 > - #define TARGET_NEWLINE 21 > - #define TARGET_VT 11 > - #define TARGET_FF 12 > - #define TARGET_CR 13 > - #endif These are no longer needed now that the parser is charset-aware. > #define TEXT_SECTION_ASM_OP "* Program text area" > #define DATA_SECTION_ASM_OP "* Program data area" > #define INIT_SECTION_ASM_OP "* Program initialization area" > + /* +++ now poisoned */ > + #if 0 > #define SHARED_SECTION_ASM_OP "* Program shared data" > + #endif This is no longer needed; it was used to support -fshared-data which is no longer present. Note that I'd expect that with the above obvious issues fixed, you may well run into additional problems in moving the port forward ... At some point, it will be necessary to be able to debug the back-end and resolve problems. Overall, I still think that adding HLASM support to the s390 back-end would probably be a simpler task ... Bye, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com