aboutsummaryrefslogtreecommitdiff
path: root/examples/gcc-4.4/patches
diff options
context:
space:
mode:
authorIgor Pashev <igor.pashev@nexenta.com>2012-10-12 19:02:57 +0400
committerIgor Pashev <igor.pashev@nexenta.com>2012-10-12 19:02:57 +0400
commitaa692c07ee42ebcc96e4b2fbeb5680b935f79c3e (patch)
tree03fd9353a76de37021315cd9d0e0f9523b52d39a /examples/gcc-4.4/patches
parentd250682cbd3c0d75ad40bad7439d114e70317b5a (diff)
downloadcibs-aa692c07ee42ebcc96e4b2fbeb5680b935f79c3e.tar.gz
GCC 4.4.7
Diffstat (limited to 'examples/gcc-4.4/patches')
-rw-r--r--examples/gcc-4.4/patches/gcc-4.4.7.illumos.patch1165
1 files changed, 1165 insertions, 0 deletions
diff --git a/examples/gcc-4.4/patches/gcc-4.4.7.illumos.patch b/examples/gcc-4.4/patches/gcc-4.4.7.illumos.patch
new file mode 100644
index 0000000..e17b58f
--- /dev/null
+++ b/examples/gcc-4.4/patches/gcc-4.4.7.illumos.patch
@@ -0,0 +1,1165 @@
+diff -dubr gcc-4.4.7/fixincludes/fixincl.x gcc-4.4.7.illumos/fixincludes/fixincl.x
+--- gcc-4.4.7/fixincludes/fixincl.x 2010-12-13 21:22:09.000000000 +0300
++++ gcc-4.4.7.illumos/fixincludes/fixincl.x 2012-09-27 21:10:47.000000000 +0400
+@@ -6420,10 +6420,22 @@
+ */
+ tSCC zSun_Auth_ProtoBypass0[] =
+ "__cplusplus";
++tSCC zSun_Auth_ProtoBypass1[] =
++ "pragma ident.*auth.*(1.4[3-9]|1.[5-9][0-9]).*SMI";
++tSCC zSun_Auth_ProtoBypass2[] =
++ "pragma ident.*clnt.*1.[6-9][0-9].*SMI";
++tSCC zSun_Auth_ProtoBypass3[] =
++ "pragma ident.*svc.*(1.69|1.[7-9][0-9]).*SMI";
++tSCC zSun_Auth_ProtoBypass4[] =
++ "pragma ident.*xdr.*(1.4[5-9]|1.[5-9][0-9]).*SMI";
+
+-#define SUN_AUTH_PROTO_TEST_CT 2
++#define SUN_AUTH_PROTO_TEST_CT 6
+ static tTestDesc aSun_Auth_ProtoTests[] = {
+ { TT_NEGREP, zSun_Auth_ProtoBypass0, (regex_t*)NULL },
++ { TT_NEGREP, zSun_Auth_ProtoBypass1, (regex_t*)NULL },
++ { TT_NEGREP, zSun_Auth_ProtoBypass2, (regex_t*)NULL },
++ { TT_NEGREP, zSun_Auth_ProtoBypass3, (regex_t*)NULL },
++ { TT_NEGREP, zSun_Auth_ProtoBypass4, (regex_t*)NULL },
+ { TT_EGREP, zSun_Auth_ProtoSelect0, (regex_t*)NULL }, };
+
+ /*
+Только в gcc-4.4.7.illumos/fixincludes: fixincl.x.orig
+diff -dubr gcc-4.4.7/fixincludes/inclhack.def gcc-4.4.7.illumos/fixincludes/inclhack.def
+--- gcc-4.4.7/fixincludes/inclhack.def 2010-12-13 21:22:09.000000000 +0300
++++ gcc-4.4.7.illumos/fixincludes/inclhack.def 2012-09-27 21:10:47.000000000 +0400
+@@ -3459,6 +3459,21 @@
+ */
+ select = '\(\*[a-z][a-z_]*\)\(\)';
+
++ /* Solaris 2.8 and above (and perhaps earlier versions) do not
++ need these fixes. The unprototyped declarations in these files
++ are only visible if __STDC__ is not defined. This test looks
++ for a #pragma ident directives with particular versions, since
++ we know those versions are OK. (Earlier versions may also be
++ OK, but we do not know that.) */
++ /* For rpc/auth.h, 1.43 or better is OK. */
++ bypass = "pragma ident.*auth.*(1\.4[3-9]|1\.[5-9][0-9]).*SMI";
++ /* For rpc/clnt.h, 1.60 or better is OK. */
++ bypass = "pragma ident.*clnt.*1\.[6-9][0-9].*SMI";
++ /* For rpc/svc.h, 1.69 or better is OK. */
++ bypass = "pragma ident.*svc.*(1\.69|1\.[7-9][0-9]).*SMI";
++ /* For rpc/xdr.h, 1.45 or better is OK. */
++ bypass = "pragma ident.*xdr.*(1\.4[5-9]|1\.[5-9][0-9]).*SMI";
++
+ c_fix = format;
+ c_fix_arg = "#ifdef __cplusplus\n%1(...);%2\n"
+ "#else\n%1();%2\n#endif";
+Только в gcc-4.4.7.illumos/fixincludes: inclhack.def.orig
+Только в gcc-4.4.7.illumos/gcc: ChangeLog.orig
+diff -dubr gcc-4.4.7/gcc/config/i386/i386.c gcc-4.4.7.illumos/gcc/config/i386/i386.c
+--- gcc-4.4.7/gcc/config/i386/i386.c 2012-02-22 23:47:42.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/i386/i386.c 2012-09-27 21:10:47.000000000 +0400
+@@ -1654,10 +1654,14 @@
+
+ saved frame pointer if frame_pointer_needed
+ <- HARD_FRAME_POINTER
+- [saved regs]
++ [-msave-args]
+
+ [padding0]
+
++ [saved regs]
++
++ [padding05]
++
+ [saved SSE regs]
+
+ [padding1] \
+@@ -1670,8 +1674,10 @@
+ */
+ struct ix86_frame
+ {
++ int nmsave_args;
+ int padding0;
+ int nsseregs;
++ int padding05;
+ int nregs;
+ int padding1;
+ int va_arg_size;
+@@ -1762,6 +1768,8 @@
+ /* Fence to use after loop using movnt. */
+ tree x86_mfence;
+
++static int ix86_nsaved_args (void);
++
+ /* Register class used for passing given 64bit part of the argument.
+ These represent classes as documented by the PS ABI, with the exception
+ of SSESF, SSEDF classes, that are basically SSE class, just gcc will
+@@ -1819,6 +1827,8 @@
+ static bool ix86_can_inline_p (tree, tree);
+ static void ix86_set_current_function (tree);
+
++static void pro_epilogue_adjust_stack (rtx, rtx, rtx, int);
++
+
+ /* The svr4 ABI for the i386 says that records and unions are returned
+ in memory. */
+@@ -2869,6 +2879,7 @@
+ error ("CPU you selected does not support x86-64 "
+ "instruction set");
+ }
++
+ /* Intel CPUs have always interpreted SSE prefetch instructions as
+ NOPs; so, we can enable SSE prefetch instructions even when
+ -mtune (rather than -march) points us to a processor that has them.
+@@ -3072,6 +3083,9 @@
+ if (TARGET_SSE4_2 || TARGET_ABM)
+ ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
+
++ if (!TARGET_64BIT && TARGET_SAVE_ARGS)
++ error ("-msave-args makes no sense in the 32-bit mode");
++
+ /* Validate -mpreferred-stack-boundary= value or default it to
+ PREFERRED_STACK_BOUNDARY_DEFAULT. */
+ ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
+@@ -7375,8 +7389,8 @@
+ return 0;
+
+ ix86_compute_frame_layout (&frame);
+- return frame.to_allocate == 0 && frame.padding0 == 0
+- && (frame.nregs + frame.nsseregs) == 0;
++ return frame.to_allocate == 0 && frame.padding05 == 0 &&
++ frame.nmsave_args == 0 && (frame.nregs + frame.nsseregs) == 0;
+ }
+
+ /* Value should be nonzero if functions must have frame pointers.
+@@ -7396,6 +7410,9 @@
+ if (SUBTARGET_FRAME_POINTER_REQUIRED)
+ return 1;
+
++ if (TARGET_SAVE_ARGS)
++ return 1;
++
+ /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
+ the frame pointer by default. Turn it back on now if we've not
+ got a leaf function. */
+@@ -7761,6 +7778,7 @@
+
+ frame->nregs = ix86_nsaved_regs ();
+ frame->nsseregs = ix86_nsaved_sseregs ();
++ frame->nmsave_args = ix86_nsaved_args ();
+ total_size = size;
+
+ stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
+@@ -7816,6 +7834,11 @@
+ else
+ frame->save_regs_using_mov = false;
+
++ if (TARGET_SAVE_ARGS)
++ {
++ cfun->machine->use_fast_prologue_epilogue = true;
++ frame->save_regs_using_mov = true;
++ }
+
+ /* Skip return address and saved base pointer. */
+ offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
+@@ -7827,17 +7850,27 @@
+ if (stack_realign_fp)
+ offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
+
++ /* Argument save area */
++ if (TARGET_SAVE_ARGS)
++ {
++ offset += frame->nmsave_args * UNITS_PER_WORD;
++ frame->padding0 = (frame->nmsave_args % 2) * UNITS_PER_WORD;
++ offset += frame->padding0;
++ }
++ else
++ frame->padding0 = 0;
++
+ /* Register save area */
+ offset += frame->nregs * UNITS_PER_WORD;
+
+ /* Align SSE reg save area. */
+ if (frame->nsseregs)
+- frame->padding0 = ((offset + 16 - 1) & -16) - offset;
++ frame->padding05 = ((offset + 16 - 1) & -16) - offset;
+ else
+- frame->padding0 = 0;
++ frame->padding05 = 0;
+
+ /* SSE register save area. */
+- offset += frame->padding0 + frame->nsseregs * 16;
++ offset += frame->padding05 + frame->nsseregs * 16;
+
+ /* Va-arg area */
+ frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
+@@ -7888,8 +7921,10 @@
+ (size + frame->padding1 + frame->padding2
+ + frame->outgoing_arguments_size + frame->va_arg_size);
+
+- if ((!frame->to_allocate && frame->nregs <= 1)
+- || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
++ if (!TARGET_SAVE_ARGS
++ && ((!frame->to_allocate && frame->nregs <= 1)
++ || (TARGET_64BIT
++ && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000)))
+ frame->save_regs_using_mov = false;
+
+ if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
+@@ -7899,7 +7934,11 @@
+ {
+ frame->red_zone_size = frame->to_allocate;
+ if (frame->save_regs_using_mov)
+- frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
++ {
++ frame->red_zone_size
++ += (frame->nregs + frame->nmsave_args) * UNITS_PER_WORD;
++ frame->red_zone_size += frame->padding0;
++ }
+ if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
+ frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
+ }
+@@ -7912,7 +7951,9 @@
+ fprintf (stderr, "size: %ld\n", (long)size);
+ fprintf (stderr, "nregs: %ld\n", (long)frame->nregs);
+ fprintf (stderr, "nsseregs: %ld\n", (long)frame->nsseregs);
++ fprintf (stderr, "nmsave_args: %ld\n", (long)frame->nmsave_args);
+ fprintf (stderr, "padding0: %ld\n", (long)frame->padding0);
++ fprintf (stderr, "padding05: %ld\n", (long)frame->padding05);
+ fprintf (stderr, "alignment1: %ld\n", (long)stack_alignment_needed);
+ fprintf (stderr, "padding1: %ld\n", (long)frame->padding1);
+ fprintf (stderr, "va_arg: %ld\n", (long)frame->va_arg_size);
+@@ -7929,6 +7970,7 @@
+ #endif
+ }
+
++
+ /* Emit code to save registers in the prologue. */
+
+ static void
+@@ -7937,6 +7979,22 @@
+ unsigned int regno;
+ rtx insn;
+
++ if (TARGET_SAVE_ARGS)
++ {
++ int i;
++ int nsaved = ix86_nsaved_args ();
++ int start = cfun->returns_struct;
++ for (i = start; i < start + nsaved; i++)
++ {
++ regno = x86_64_int_parameter_registers[i];
++ insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
++ RTX_FRAME_RELATED_P (insn) = 1;
++ }
++ if (nsaved % 2 != 0)
++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-UNITS_PER_WORD), -1);
++ }
++
+ for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
+ {
+@@ -7962,6 +8020,24 @@
+ RTX_FRAME_RELATED_P (insn) = 1;
+ offset += UNITS_PER_WORD;
+ }
++
++ if (TARGET_SAVE_ARGS)
++ {
++ int i;
++ int nsaved = ix86_nsaved_args ();
++ int start = cfun->returns_struct;
++ if (nsaved % 2 != 0)
++ offset += UNITS_PER_WORD;
++ for (i = start + nsaved - 1; i >= start; i--)
++ {
++ regno = x86_64_int_parameter_registers[i];
++ insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
++ Pmode, offset),
++ gen_rtx_REG (Pmode, regno));
++ RTX_FRAME_RELATED_P (insn) = 1;
++ offset += UNITS_PER_WORD;
++ }
++ }
+ }
+
+ /* Emit code to save registers using MOV insns. First register
+@@ -8288,12 +8364,13 @@
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+
+- allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
++ allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding05;
+
+ if (!frame.save_regs_using_mov)
+ ix86_emit_save_regs ();
+ else
+- allocate += frame.nregs * UNITS_PER_WORD;
++ allocate += (frame.nregs + frame.nmsave_args) * UNITS_PER_WORD
++ + frame.padding0;
+
+ /* When using red zone we may start register saving before allocating
+ the stack frame saving one cycle of the prologue. However I will
+@@ -8306,7 +8383,8 @@
+ && !crtl->stack_realign_needed)
+ ? hard_frame_pointer_rtx
+ : stack_pointer_rtx,
+- -frame.nregs * UNITS_PER_WORD);
++ -(frame.nregs + frame.nmsave_args)
++ * UNITS_PER_WORD - frame.padding0);
+
+ if (allocate == 0)
+ ;
+@@ -8360,16 +8438,20 @@
+ && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
+ && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
+ {
+- if (!frame_pointer_needed
+- || !(frame.to_allocate + frame.padding0)
+- || crtl->stack_realign_needed)
++ if (!TARGET_SAVE_ARGS &&
++ (!frame_pointer_needed
++ || !(frame.to_allocate + frame.padding05)
++ || crtl->stack_realign_needed))
+ ix86_emit_save_regs_using_mov (stack_pointer_rtx,
+ frame.to_allocate
+- + frame.nsseregs * 16 + frame.padding0);
++ + frame.nsseregs * 16 + frame.padding05);
+ else
++ /* XXX: Does this need help for SSE? */
+ ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
+- -frame.nregs * UNITS_PER_WORD);
++ -(frame.nregs + frame.nmsave_args)
++ * UNITS_PER_WORD - frame.padding0);
+ }
++ /* XXX: Does these need help for save-args? */
+ if (!frame_pointer_needed
+ || !(frame.to_allocate + frame.padding0)
+ || crtl->stack_realign_needed)
+@@ -8379,7 +8461,7 @@
+ ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
+ - frame.nregs * UNITS_PER_WORD
+ - frame.nsseregs * 16
+- - frame.padding0);
++ - frame.padding05);
+
+ pic_reg_used = false;
+ if (pic_offset_table_rtx
+@@ -8538,11 +8620,11 @@
+ must be taken for the normal return case of a function using
+ eh_return: the eax and edx registers are marked as saved, but not
+ restored along this path. */
+- offset = frame.nregs;
++ offset = frame.nregs + frame.nmsave_args;
+ if (crtl->calls_eh_return && style != 2)
+ offset -= 2;
+ offset *= -UNITS_PER_WORD;
+- offset -= frame.nsseregs * 16 + frame.padding0;
++ offset -= frame.nsseregs * 16 + frame.padding05 + frame.padding0;
+
+ /* If we're only restoring one register and sp is not valid then
+ using a move instruction to restore the register since it's
+@@ -8584,7 +8666,7 @@
+ ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
+ frame.to_allocate
+ + frame.nsseregs * 16
+- + frame.padding0, style == 2);
++ + frame.padding05, style == 2);
+ }
+ else
+ {
+@@ -8593,7 +8675,7 @@
+ ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
+ offset
+ + frame.nsseregs * 16
+- + frame.padding0, style == 2);
++ + frame.padding05, style == 2);
+ }
+
+ /* eh_return epilogues need %ecx added to the stack pointer. */
+@@ -8620,18 +8702,20 @@
+ {
+ tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
+ tmp = plus_constant (tmp, (frame.to_allocate
+- + frame.nregs * UNITS_PER_WORD
++ + (frame.nregs + frame.nmsave_args)
++ * UNITS_PER_WORD
+ + frame.nsseregs * 16
+- + frame.padding0));
++ + frame.padding05 + frame.padding0));
+ emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
+ }
+ }
+ else if (!frame_pointer_needed)
+ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
+ GEN_INT (frame.to_allocate
+- + frame.nregs * UNITS_PER_WORD
++ + (frame.nregs + frame.nmsave_args)
++ * UNITS_PER_WORD
+ + frame.nsseregs * 16
+- + frame.padding0),
++ + frame.padding05 + frame.padding0),
+ style);
+ /* If not an i386, mov & pop is faster than "leave". */
+ else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
+@@ -8676,12 +8760,17 @@
+ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
+ GEN_INT (frame.to_allocate
+ + frame.nsseregs * 16
+- + frame.padding0), style);
++ + frame.padding05), style);
+ }
+
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
+ emit_insn ((*ix86_gen_pop1) (gen_rtx_REG (Pmode, regno)));
++
++ /* XXX: Needs adjustment for SSE regs? */
++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (frame.nmsave_args * UNITS_PER_WORD
++ + frame.padding0), style);
+ if (frame_pointer_needed)
+ {
+ /* Leave results in shorter dependency chains on CPUs that are
+@@ -9110,10 +9199,21 @@
+ return CONSTANT_P (x) && legitimate_address_p (Pmode, x, 1);
+ }
+
++/* Return number of arguments to be saved on the stack with
++ -msave-args. */
++
++static int
++ix86_nsaved_args (void)
++{
++ if (TARGET_SAVE_ARGS)
++ return crtl->args.info.regno - cfun->returns_struct;
++ else
++ return 0;
++}
++
+ /* Nonzero if the constant value X is a legitimate general operand
+ when generating PIC code. It is given that flag_pic is on and
+ that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
+-
+ bool
+ legitimate_pic_operand_p (rtx x)
+ {
+Только в gcc-4.4.7.illumos/gcc/config/i386: i386.c.orig
+diff -dubr gcc-4.4.7/gcc/config/i386/i386.opt gcc-4.4.7.illumos/gcc/config/i386/i386.opt
+--- gcc-4.4.7/gcc/config/i386/i386.opt 2009-02-20 18:20:38.000000000 +0300
++++ gcc-4.4.7.illumos/gcc/config/i386/i386.opt 2012-09-27 21:10:47.000000000 +0400
+@@ -224,6 +224,10 @@
+ Target Report Mask(TLS_DIRECT_SEG_REFS)
+ Use direct references against %gs when accessing tls data
+
++msave-args
++Target Report Mask(SAVE_ARGS)
++Save integer arguments on the stack at function entry
++
+ mtune=
+ Target RejectNegative Joined Var(ix86_tune_string)
+ Schedule code for given CPU
+diff -dubr gcc-4.4.7/gcc/config/i386/sol2-10.h gcc-4.4.7.illumos/gcc/config/i386/sol2-10.h
+--- gcc-4.4.7/gcc/config/i386/sol2-10.h 2010-07-15 14:08:56.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/i386/sol2-10.h 2012-09-27 21:10:47.000000000 +0400
+@@ -94,7 +94,7 @@
+ %{R*} \
+ %{compat-bsd: \
+ %{!YP,*:%{p|pg:-Y P,/usr/ucblib/64:/usr/lib/libp/64:/lib/64:/usr/lib/64} \
+- %{!p:%{!pg:-Y P,/usr/ucblib/64:/lib:/usr/lib/64}}} \
++ %{!p:%{!pg:-Y P,/usr/ucblib/64:/lib/64:/usr/lib/64}}} \
+ -R /usr/ucblib/64} \
+ %{!compat-bsd: \
+ %{!YP,*:%{p|pg:-Y P,/usr/lib/libp/64:/lib/64:/usr/lib/64} \
+diff -dubr gcc-4.4.7/gcc/config/sol2-c.c gcc-4.4.7.illumos/gcc/config/sol2-c.c
+--- gcc-4.4.7/gcc/config/sol2-c.c 2007-09-18 02:07:46.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sol2-c.c 2012-09-27 21:10:47.000000000 +0400
+@@ -114,8 +114,9 @@
+ {
+ tree decl = identifier_global_value (t);
+ if (decl && DECL_P (decl))
+- warning (0, "%<#pragma align%> must appear before the declaration of "
+- "%D, ignoring", decl);
++ decl_attributes (&decl, build_tree_list (get_identifier ("aligned"),
++ build_tree_list (NULL, x)),
++ 0);
+ else
+ solaris_pending_aligns = tree_cons (t, build_tree_list (NULL, x),
+ solaris_pending_aligns);
+diff -dubr gcc-4.4.7/gcc/config/sol2.h gcc-4.4.7.illumos/gcc/config/sol2.h
+--- gcc-4.4.7/gcc/config/sol2.h 2010-06-02 21:51:29.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sol2.h 2012-09-27 21:10:47.000000000 +0400
+@@ -123,12 +123,12 @@
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+- %{!p:%{!pg:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}}} \
++ %{!YP,*:%{p|pg:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \
++ %{!p:%{!pg:-Y P,/usr/ucblib:/usr/ccs/lib:/lib:/usr/lib}}} \
+ -R /usr/ucblib} \
+ %{!compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+- %{!p:%{!pg:-Y P,/usr/ccs/lib:/usr/lib}}}}"
++ %{!YP,*:%{p|pg:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \
++ %{!p:%{!pg:-Y P,/usr/ccs/lib:/lib:/usr/lib}}}}"
+
+ #undef LINK_ARCH32_SPEC
+ #define LINK_ARCH32_SPEC LINK_ARCH32_SPEC_BASE
+diff -dubr gcc-4.4.7/gcc/config/sparc/sol2-bi.h gcc-4.4.7.illumos/gcc/config/sparc/sol2-bi.h
+--- gcc-4.4.7/gcc/config/sparc/sol2-bi.h 2007-10-19 08:29:38.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sparc/sol2-bi.h 2012-09-27 21:10:47.000000000 +0400
+@@ -172,12 +172,12 @@
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+- %{!p:%{!pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/sparcv9}}} \
++ %{!YP,*:%{p|pg:-Y P,/usr/ucblib/64:/usr/lib/libp/64:/lib/64:/usr/lib/64} \
++ %{!p:%{!pg:-Y P,/usr/ucblib/64:/lib/64:/usr/lib/64}}} \
+ -R /usr/ucblib/sparcv9} \
+ %{!compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+- %{!p:%{!pg:-Y P,/usr/lib/sparcv9}}}}"
++ %{!YP,*:%{p|pg:-Y P,/usr/lib/libp/64:/lib/64:/usr/lib/64} \
++ %{!p:%{!pg:-Y P,/lib/64:/usr/lib/64}}}}"
+
+ #define LINK_ARCH64_SPEC LINK_ARCH64_SPEC_BASE
+
+diff -dubr gcc-4.4.7/gcc/config/sparc/sparc.c gcc-4.4.7.illumos/gcc/config/sparc/sparc.c
+--- gcc-4.4.7/gcc/config/sparc/sparc.c 2011-06-06 03:20:56.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sparc/sparc.c 2012-09-27 21:10:47.000000000 +0400
+@@ -2984,6 +2984,9 @@
+ if (TARGET_ARCH32 && !optimize
+ && (mode == DFmode || mode == DImode))
+ return 0;
++ if (TARGET_ARCH32 && TARGET_NO_INTEGER_LDD_STD
++ && mode == DImode)
++ return 0;
+ }
+ else if (USE_AS_OFFSETABLE_LO10
+ && GET_CODE (rs1) == LO_SUM
+@@ -6574,7 +6577,8 @@
+
+ /* If we have legitimate args for ldd/std, we do not want
+ the split to happen. */
+- if ((REGNO (reg) % 2) == 0
++ if (!TARGET_NO_INTEGER_LDD_STD
++ && (REGNO (reg) % 2) == 0
+ && mem_min_alignment (mem, 8))
+ return 0;
+
+Только в gcc-4.4.7.illumos/gcc/config/sparc: sparc.c.orig
+diff -dubr gcc-4.4.7/gcc/config/sparc/sparc.h gcc-4.4.7.illumos/gcc/config/sparc/sparc.h
+--- gcc-4.4.7/gcc/config/sparc/sparc.h 2011-05-22 02:05:52.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sparc/sparc.h 2012-09-27 21:10:47.000000000 +0400
+@@ -2402,3 +2402,5 @@
+
+ /* We use gcc _mcount for profiling. */
+ #define NO_PROFILE_COUNTERS 0
++
++#define ASSUME_32BIT_CALLERS sparc_assume_32bit_callers
+diff -dubr gcc-4.4.7/gcc/config/sparc/sparc.md gcc-4.4.7.illumos/gcc/config/sparc/sparc.md
+--- gcc-4.4.7/gcc/config/sparc/sparc.md 2011-06-09 23:51:17.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sparc/sparc.md 2012-09-27 21:10:47.000000000 +0400
+@@ -1959,7 +1959,7 @@
+ "=o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
+ (match_operand:DI 1 "input_operand"
+ " J,U,T,r,o,i,r, f, T, o, f, f"))]
+- "! TARGET_V9
++ "! TARGET_V9 && ! TARGET_NO_INTEGER_LDD_STD
+ && (register_operand (operands[0], DImode)
+ || register_or_zero_operand (operands[1], DImode))"
+ "@
+@@ -1978,12 +1978,36 @@
+ [(set_attr "type" "store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
+ (set_attr "length" "2,*,*,2,2,2,2,*,*,2,2,2")])
+
++(define_insn "*movdi_insn_sp32_nolddstd"
++ [(set (match_operand:DI 0 "nonimmediate_operand"
++ "=o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
++ (match_operand:DI 1 "input_operand"
++ " J,U,T,r,o,i,r, f, T, o, f, f"))]
++ "! TARGET_V9 && TARGET_NO_INTEGER_LDD_STD
++ && (register_operand (operands[0], DImode)
++ || register_or_zero_operand (operands[1], DImode))"
++ "@
++ #
++ #
++ #
++ #
++ #
++ #
++ #
++ std\t%1, %0
++ ldd\t%1, %0
++ #
++ #
++ #"
++ [(set_attr "type" "store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
++ (set_attr "length" "2,2,2,2,2,2,2,*,*,2,2,2")])
++
+ (define_insn "*movdi_insn_sp32_v9"
+ [(set (match_operand:DI 0 "nonimmediate_operand"
+ "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?e,?e,?W")
+ (match_operand:DI 1 "input_operand"
+ " J,J,U,T,r,o,i,r, f, T, o, f, e, W, e"))]
+- "! TARGET_ARCH64
++ "! TARGET_ARCH64 && ! TARGET_NO_INTEGER_LDD_STD
+ && TARGET_V9
+ && (register_operand (operands[0], DImode)
+ || register_or_zero_operand (operands[1], DImode))"
+@@ -2007,6 +2031,35 @@
+ (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,*,*")
+ (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*")])
+
++
++(define_insn "*movdi_insn_sp32_v9_nolddstd"
++ [(set (match_operand:DI 0 "nonimmediate_operand"
++ "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?e,?e,?W")
++ (match_operand:DI 1 "input_operand"
++ " J,J,U,T,r,o,i,r, f, T, o, f, e, W, e"))]
++ "! TARGET_ARCH64 && TARGET_V9 && TARGET_NO_INTEGER_LDD_STD
++ && (register_operand (operands[0], DImode)
++ || register_or_zero_operand (operands[1], DImode))"
++ "@
++ stx\t%%g0, %0
++ #
++ #
++ #
++ #
++ #
++ #
++ #
++ std\t%1, %0
++ ldd\t%1, %0
++ #
++ #
++ fmovd\\t%1, %0
++ ldd\\t%1, %0
++ std\\t%1, %0"
++ [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,fpmove,fpload,fpstore")
++ (set_attr "length" "*,2,2,2,2,2,2,2,*,*,2,2,*,*,*")
++ (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*")])
++
+ (define_insn "*movdi_insn_sp64"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,m,?e,?e,?W,b")
+ (match_operand:DI 1 "input_operand" "rI,N,m,rJ,e,W,e,J"))]
+@@ -7201,7 +7254,7 @@
+ (const_int 0))
+ (set (match_operand:SI 1 "memory_operand" "")
+ (const_int 0))]
+- "TARGET_V9
++ "TARGET_V9 && ! TARGET_NO_INTEGER_LDD_STD
+ && mems_ok_for_ldd_peep (operands[0], operands[1], NULL_RTX)"
+ [(set (match_dup 0)
+ (const_int 0))]
+@@ -7212,7 +7265,7 @@
+ (const_int 0))
+ (set (match_operand:SI 1 "memory_operand" "")
+ (const_int 0))]
+- "TARGET_V9
++ "TARGET_V9 && ! TARGET_NO_INTEGER_LDD_STD
+ && mems_ok_for_ldd_peep (operands[1], operands[0], NULL_RTX)"
+ [(set (match_dup 1)
+ (const_int 0))]
+@@ -7223,7 +7276,8 @@
+ (match_operand:SI 1 "memory_operand" ""))
+ (set (match_operand:SI 2 "register_operand" "")
+ (match_operand:SI 3 "memory_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[0], operands[2])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[0], operands[2])
+ && mems_ok_for_ldd_peep (operands[1], operands[3], operands[0])"
+ [(set (match_dup 0)
+ (match_dup 1))]
+@@ -7235,7 +7289,8 @@
+ (match_operand:SI 1 "register_operand" ""))
+ (set (match_operand:SI 2 "memory_operand" "")
+ (match_operand:SI 3 "register_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[1], operands[3])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[1], operands[3])
+ && mems_ok_for_ldd_peep (operands[0], operands[2], NULL_RTX)"
+ [(set (match_dup 0)
+ (match_dup 1))]
+@@ -7247,7 +7302,8 @@
+ (match_operand:SF 1 "memory_operand" ""))
+ (set (match_operand:SF 2 "register_operand" "")
+ (match_operand:SF 3 "memory_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[0], operands[2])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[0], operands[2])
+ && mems_ok_for_ldd_peep (operands[1], operands[3], operands[0])"
+ [(set (match_dup 0)
+ (match_dup 1))]
+@@ -7259,7 +7315,8 @@
+ (match_operand:SF 1 "register_operand" ""))
+ (set (match_operand:SF 2 "memory_operand" "")
+ (match_operand:SF 3 "register_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[1], operands[3])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[1], operands[3])
+ && mems_ok_for_ldd_peep (operands[0], operands[2], NULL_RTX)"
+ [(set (match_dup 0)
+ (match_dup 1))]
+@@ -7271,7 +7328,8 @@
+ (match_operand:SI 1 "memory_operand" ""))
+ (set (match_operand:SI 2 "register_operand" "")
+ (match_operand:SI 3 "memory_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[2], operands[0])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[2], operands[0])
+ && mems_ok_for_ldd_peep (operands[3], operands[1], operands[0])"
+ [(set (match_dup 2)
+ (match_dup 3))]
+@@ -7283,7 +7341,8 @@
+ (match_operand:SI 1 "register_operand" ""))
+ (set (match_operand:SI 2 "memory_operand" "")
+ (match_operand:SI 3 "register_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[3], operands[1])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[3], operands[1])
+ && mems_ok_for_ldd_peep (operands[2], operands[0], NULL_RTX)"
+ [(set (match_dup 2)
+ (match_dup 3))]
+@@ -7296,7 +7355,8 @@
+ (match_operand:SF 1 "memory_operand" ""))
+ (set (match_operand:SF 2 "register_operand" "")
+ (match_operand:SF 3 "memory_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[2], operands[0])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[2], operands[0])
+ && mems_ok_for_ldd_peep (operands[3], operands[1], operands[0])"
+ [(set (match_dup 2)
+ (match_dup 3))]
+@@ -7308,7 +7368,8 @@
+ (match_operand:SF 1 "register_operand" ""))
+ (set (match_operand:SF 2 "memory_operand" "")
+ (match_operand:SF 3 "register_operand" ""))]
+- "registers_ok_for_ldd_peep (operands[3], operands[1])
++ "! TARGET_NO_INTEGER_LDD_STD
++ && registers_ok_for_ldd_peep (operands[3], operands[1])
+ && mems_ok_for_ldd_peep (operands[2], operands[0], NULL_RTX)"
+ [(set (match_dup 2)
+ (match_dup 3))]
+Только в gcc-4.4.7.illumos/gcc/config/sparc: sparc.md.orig
+diff -dubr gcc-4.4.7/gcc/config/sparc/sparc.opt gcc-4.4.7.illumos/gcc/config/sparc/sparc.opt
+--- gcc-4.4.7/gcc/config/sparc/sparc.opt 2007-08-02 14:49:31.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/config/sparc/sparc.opt 2012-09-27 21:10:47.000000000 +0400
+@@ -38,6 +38,10 @@
+ Target Report
+ Pass -assert pure-text to linker
+
++mno-integer-ldd-std
++Target Report RejectNegative Mask(NO_INTEGER_LDD_STD)
++Utilize integer ldd and std
++
+ mapp-regs
+ Target Report Mask(APP_REGS)
+ Use ABI reserved registers
+@@ -102,6 +106,10 @@
+ Target Report RejectNegative Var(sparc_std_struct_return)
+ Enable strict 32-bit psABI struct return checking.
+
++massume-32bit-callers
++Target Report Var(sparc_assume_32bit_callers)
++Allow 64bit sparcv9 code to function with 32bit sparcv7 direct callers.
++
+ Mask(LITTLE_ENDIAN)
+ ;; Generate code for little-endian
+
+diff -dubr gcc-4.4.7/gcc/config.gcc gcc-4.4.7.illumos/gcc/config.gcc
+--- gcc-4.4.7/gcc/config.gcc 2011-02-19 00:39:51.000000000 +0300
++++ gcc-4.4.7.illumos/gcc/config.gcc 2012-09-27 21:10:47.000000000 +0400
+@@ -1237,6 +1237,8 @@
+ "":*:yes | yes:*:yes )
+ thread_file=solaris
+ ;;
++ *)
++ extra_parts="gmon.o crtbegin.o crtend.o"
+ esac
+ ;;
+ i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae)
+Только в gcc-4.4.7.illumos/gcc: config.gcc.orig
+diff -dubr gcc-4.4.7/gcc/cp/g++spec.c gcc-4.4.7.illumos/gcc/cp/g++spec.c
+--- gcc-4.4.7/gcc/cp/g++spec.c 2009-02-20 18:20:38.000000000 +0300
++++ gcc-4.4.7.illumos/gcc/cp/g++spec.c 2012-09-27 21:10:52.000000000 +0400
+@@ -260,7 +260,7 @@
+ #endif
+
+ /* Make sure to have room for the trailing NULL argument. */
+- num_args = argc + added + need_math + shared_libgcc + (library > 0) + 1;
++ num_args = argc + added + need_math + shared_libgcc + 2 * (library > 0) + 1;
+ arglist = XNEWVEC (const char *, num_args);
+
+ i = 0;
+diff -dubr gcc-4.4.7/gcc/cp/Make-lang.in gcc-4.4.7.illumos/gcc/cp/Make-lang.in
+--- gcc-4.4.7/gcc/cp/Make-lang.in 2009-09-09 12:46:32.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/cp/Make-lang.in 2012-09-27 21:10:52.000000000 +0400
+@@ -55,7 +55,7 @@
+ g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) coretypes.h $(TM_H) $(GCC_H) $(CONFIG_H)
+ (SHLIB_LINK='$(SHLIB_LINK)'; \
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \
+- $(INCLUDES) $(srcdir)/cp/g++spec.c)
++ -DLIBDIR=\"$(libdir)\" $(INCLUDES) $(srcdir)/cp/g++spec.c)
+
+ # Create the compiler driver for g++.
+ GXX_OBJS = $(GCC_OBJS) g++spec.o intl.o prefix.o version.o
+diff -dubr gcc-4.4.7/gcc/doc/cpp.texi gcc-4.4.7.illumos/gcc/doc/cpp.texi
+--- gcc-4.4.7/gcc/doc/cpp.texi 2008-08-05 21:24:37.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/doc/cpp.texi 2012-09-27 21:10:52.000000000 +0400
+@@ -3508,8 +3508,6 @@
+ official GNU extensions either. What historical information we have
+ been able to find, suggests they originated with System V@.
+
+-Both @samp{#ident} and @samp{#sccs} are deprecated extensions.
+-
+ @cindex null directive
+ The @dfn{null directive} consists of a @samp{#} followed by a newline,
+ with only whitespace (including comments) in between. A null directive
+diff -dubr gcc-4.4.7/gcc/doc/invoke.texi gcc-4.4.7.illumos/gcc/doc/invoke.texi
+--- gcc-4.4.7/gcc/doc/invoke.texi 2011-03-24 01:02:12.000000000 +0300
++++ gcc-4.4.7.illumos/gcc/doc/invoke.texi 2012-09-27 21:10:52.000000000 +0400
+@@ -793,7 +793,8 @@
+ -mfaster-structs -mno-faster-structs @gol
+ -mfpu -mno-fpu -mhard-float -msoft-float @gol
+ -mhard-quad-float -msoft-quad-float @gol
+--mimpure-text -mno-impure-text -mlittle-endian @gol
++-mimpure-text -mno-impure-text @gol
++-mno-integer-ldd-std -mlittle-endian @gol
+ -mstack-bias -mno-stack-bias @gol
+ -munaligned-doubles -mno-unaligned-doubles @gol
+ -mv8plus -mno-v8plus -mvis -mno-vis
+@@ -11549,6 +11550,10 @@
+ @opindex mcmodel=large
+ Generate code for the large model: This model makes no assumptions
+ about addresses and sizes of sections.
++
++@item -msave-args
++@opindex msave-args
++Save integer arguments on the stack at function entry.
+ @end table
+
+ @node i386 and x86-64 Windows Options
+@@ -15178,6 +15183,23 @@
+ @opindex mno-vis
+ With @option{-mvis}, GCC generates code that takes advantage of the UltraSPARC
+ Visual Instruction Set extensions. The default is @option{-mno-vis}.
++
++@item -mno-integer-ldd-std
++@opindex mno-integer-ldd-std
++With @option{-mno-integer-ldd-std}, GCC does not use the @code{ldd}
++and @code{std} instructions for integer operands in 32-bit mode. This
++is for use with legacy code using 64-bit quantities which are not
++64-bit aligned.
++
++@item -massume-32bit-callers
++@opindex massume-32bit-callers
++With @option{-massume-32bit-callers}, The type promotion of function
++arguments is altered such that integer arguments smaller than the word
++size are extended in the callee rather than the caller. This is
++necessary for system calls from 32bit processes to 64bit kernels in
++certain systems. This option should not be used in any situation
++other than compiling the kernels of such systems, and has not been
++tested outside of that scenario.
+ @end table
+
+ These @samp{-m} options are supported in addition to the above
+Только в gcc-4.4.7.illumos/gcc/doc: invoke.texi.orig
+diff -dubr gcc-4.4.7/gcc/dwarf2.h gcc-4.4.7.illumos/gcc/dwarf2.h
+--- gcc-4.4.7/gcc/dwarf2.h 2009-04-10 03:23:07.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/dwarf2.h 2012-09-27 21:10:52.000000000 +0400
+@@ -377,6 +377,8 @@
+ DW_AT_GNU_vector = 0x2107,
+ /* VMS extensions. */
+ DW_AT_VMS_rtnbeg_pd_address = 0x2201,
++ /* Sun extension. */
++ DW_AT_SUN_amd64_parmdump = 0x2224,
+ /* UPC extension. */
+ DW_AT_upc_threads_scaled = 0x3210,
+ /* PGI (STMicroelectronics) extensions. */
+diff -dubr gcc-4.4.7/gcc/dwarf2out.c gcc-4.4.7.illumos/gcc/dwarf2out.c
+--- gcc-4.4.7/gcc/dwarf2out.c 2011-04-08 01:27:59.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/dwarf2out.c 2012-09-27 21:10:53.000000000 +0400
+@@ -9362,10 +9362,6 @@
+
+ base_type_result = new_die (DW_TAG_base_type, comp_unit_die, type);
+
+- /* This probably indicates a bug. */
+- if (! TYPE_NAME (type))
+- add_name_attribute (base_type_result, "__unknown__");
+-
+ add_AT_unsigned (base_type_result, DW_AT_byte_size,
+ int_size_in_bytes (type));
+ add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
+@@ -9541,6 +9537,21 @@
+ ((is_const_type ? TYPE_QUAL_CONST : 0)
+ | (is_volatile_type ? TYPE_QUAL_VOLATILE : 0)));
+
++ if (qualified_type == sizetype
++ && TYPE_NAME (qualified_type)
++ && TREE_CODE (TYPE_NAME (qualified_type)) == TYPE_DECL)
++ {
++#ifdef ENABLE_CHECKING
++ gcc_assert (TREE_CODE (TREE_TYPE (TYPE_NAME (qualified_type)))
++ == INTEGER_TYPE
++ && TYPE_PRECISION (TREE_TYPE (TYPE_NAME (qualified_type)))
++ == TYPE_PRECISION (qualified_type)
++ && TYPE_UNSIGNED (TREE_TYPE (TYPE_NAME (qualified_type)))
++ == TYPE_UNSIGNED (qualified_type));
++#endif
++ qualified_type = TREE_TYPE (TYPE_NAME (qualified_type));
++ }
++
+ /* If we do, then we can just use its DIE, if it exists. */
+ if (qualified_type)
+ {
+@@ -9638,6 +9649,9 @@
+ name = DECL_NAME (name);
+ add_name_attribute (mod_type_die, IDENTIFIER_POINTER (name));
+ }
++ /* This probably indicates a bug. */
++ else if (mod_type_die->die_tag == DW_TAG_base_type)
++ add_name_attribute (mod_type_die, "__unknown__");
+
+ if (qualified_type)
+ equate_type_number_to_die (qualified_type, mod_type_die);
+@@ -13941,6 +13955,10 @@
+ /* Add the calling convention attribute if requested. */
+ add_calling_convention_attribute (subr_die, decl);
+
++#ifdef TARGET_SAVE_ARGS
++ if (TARGET_SAVE_ARGS)
++ add_AT_flag (subr_die, DW_AT_SUN_amd64_parmdump, 1);
++#endif
+ }
+
+ /* Returns a hash value for X (which really is a die_struct). */
+@@ -15525,9 +15543,6 @@
+
+ if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL)
+ {
+- if (is_base_type (TREE_TYPE (decl)))
+- at_import_die = base_type_die (TREE_TYPE (decl));
+- else
+ at_import_die = force_type_die (TREE_TYPE (decl));
+ /* For namespace N { typedef void T; } using N::T; base_type_die
+ returns NULL, but DW_TAG_imported_declaration requires
+diff -dubr gcc-4.4.7/gcc/expr.c gcc-4.4.7.illumos/gcc/expr.c
+--- gcc-4.4.7/gcc/expr.c 2011-07-21 13:39:16.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/expr.c 2012-09-27 21:10:53.000000000 +0400
+@@ -79,6 +79,10 @@
+ #endif
+ #endif
+
++#ifndef ASSUME_32BIT_CALLERS
++#define ASSUME_32BIT_CALLERS 0
++#endif
++
+
+ /* If this is nonzero, we do not bother generating VOLATILE
+ around volatile memory references, and we are willing to
+@@ -7361,7 +7365,8 @@
+ same mode we got when the variable was declared. */
+ pmode = promote_mode (type, DECL_MODE (exp), &unsignedp,
+ (TREE_CODE (exp) == RESULT_DECL
+- || TREE_CODE (exp) == PARM_DECL) ? 1 : 0);
++ || (!ASSUME_32BIT_CALLERS &&
++ TREE_CODE (exp) == PARM_DECL)) ? 1 : 0);
+ gcc_assert (GET_MODE (decl_rtl) == pmode);
+
+ temp = gen_lowpart_SUBREG (mode, decl_rtl);
+Только в gcc-4.4.7.illumos/gcc: expr.c.orig
+diff -dubr gcc-4.4.7/gcc/function.c gcc-4.4.7.illumos/gcc/function.c
+--- gcc-4.4.7/gcc/function.c 2010-08-17 00:24:54.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/function.c 2012-09-27 21:10:53.000000000 +0400
+@@ -83,6 +83,10 @@
+ #define NAME__MAIN "__main"
+ #endif
+
++#ifndef ASSUME_32BIT_CALLERS
++#define ASSUME_32BIT_CALLERS 0
++#endif
++
+ /* Round a value to the lowest integer less than it that is a multiple of
+ the required alignment. Avoid using division in case the value is
+ negative. Assume the alignment is a power of two. */
+@@ -2789,7 +2793,8 @@
+ /* This is not really promoting for a call. However we need to be
+ consistent with assign_parm_find_data_types and expand_expr_real_1. */
+ promoted_nominal_mode
+- = promote_mode (data->nominal_type, data->nominal_mode, &unsignedp, 1);
++ = promote_mode (data->nominal_type, data->nominal_mode, &unsignedp,
++ ASSUME_32BIT_CALLERS ? 0 : 1);
+
+ parmreg = gen_reg_rtx (promoted_nominal_mode);
+
+Только в gcc-4.4.7.illumos/gcc: function.c.orig
+diff -dubr gcc-4.4.7/gcc/Makefile.in gcc-4.4.7.illumos/gcc/Makefile.in
+--- gcc-4.4.7/gcc/Makefile.in 2010-09-07 15:07:31.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/Makefile.in 2012-09-27 21:10:53.000000000 +0400
+@@ -4725,7 +4725,7 @@
+ # script does that.
+ .po.gmo:
+ $(mkinstalldirs) po
+- $(GMSGFMT) --statistics -o $@ $<
++ $(GMSGFMT) -o $@ $<
+
+ # The new .po has to be gone over by hand, so we deposit it into
+ # build/po with a different extension.
+Только в gcc-4.4.7.illumos/gcc/testsuite: ChangeLog.orig
+diff -dubr gcc-4.4.7/gcc/testsuite/gcc.dg/pragma-align-2.c gcc-4.4.7.illumos/gcc/testsuite/gcc.dg/pragma-align-2.c
+--- gcc-4.4.7/gcc/testsuite/gcc.dg/pragma-align-2.c 2008-09-23 13:42:50.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/testsuite/gcc.dg/pragma-align-2.c 2012-09-27 21:10:53.000000000 +0400
+@@ -25,9 +25,9 @@
+ #pragma align bad_align /* { dg-warning "malformed" } */
+ #pragma align 1(bad_align /* { dg-warning "malformed" } */
+
+-int x, x1, x2, x4, x8, y8, z8, x16, x32, x64, x128, y128, z128;
++int x1, x2, x4, x8, y8, z8, x16, y16, x32, x64, x128, y128, z128;
+
+-#pragma align 16(x) /* { dg-warning "must appear before" } */
++#pragma align 16(y16)
+
+ int
+ main ()
+@@ -47,6 +47,9 @@
+ if (__alignof__ (x16) < 16)
+ abort ();
+
++ if (__alignof__ (y16) < 16)
++ abort ();
++
+ if (__alignof__ (x32) < 32)
+ abort ();
+
+diff -dubr gcc-4.4.7/gcc/testsuite/lib/gcc-dg.exp gcc-4.4.7.illumos/gcc/testsuite/lib/gcc-dg.exp
+--- gcc-4.4.7/gcc/testsuite/lib/gcc-dg.exp 2009-04-22 15:35:25.000000000 +0400
++++ gcc-4.4.7.illumos/gcc/testsuite/lib/gcc-dg.exp 2012-09-27 21:11:00.000000000 +0400
+@@ -343,6 +343,37 @@
+ }
+ }
+
++# ARGS is a list. The 0th element is the line number at which the
++# dg-forbid-option directive appeared in the source file. The 1st
++# element is a regular expression. If the regular expression matches
++# the command-line options implied by the current multilib, then the
++# test will be treated as unsupported. The 2nd element of the list,
++# if present, is a target selector conditionalizing this directive;
++# if the target selector does not match the current target, this
++# dg-forbid-option directive is ignored.
++
++proc dg-forbid-option { args } {
++ set target_name [target_info name]
++ set pattern [lindex $args 1]
++
++ if {[llength $args] > 2} {
++ set selector [lindex $args 2]
++ if { [dg-process-target $selector] == "N" } {
++ return
++ }
++ }
++
++ # Check to see if the option occurs in the multilib options
++ # for this target.
++ if {[board_info $target_name exists multilib_flags]} {
++ set multilib_flags [board_info $target_name multilib_flags]
++ if { [regexp -- ${pattern} $multilib_flags] } {
++ upvar dg-do-what dg-do-what
++ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
++ }
++ }
++}
++
+ # Prune any messages matching ARGS[1] (a regexp) from test output.
+ proc dg-prune-output { args } {
+ global additional_prunes
+diff -dubr gcc-4.4.7/gcc/varasm.c gcc-4.4.7.illumos/gcc/varasm.c
+--- gcc-4.4.7/gcc/varasm.c 2010-01-20 14:27:49.000000000 +0300
++++ gcc-4.4.7.illumos/gcc/varasm.c 2012-09-27 21:11:00.000000000 +0400
+@@ -5484,6 +5484,9 @@
+ #endif
+ }
+
++ if (TREE_ASM_WRITTEN (decl))
++ return;
++
+ /* We must force creation of DECL_RTL for debug info generation, even though
+ we don't use it here. */
+ make_decl_rtl (decl);
+diff -dubr gcc-4.4.7/intl/configure gcc-4.4.7.illumos/intl/configure
+--- gcc-4.4.7/intl/configure 2010-10-02 15:40:32.000000000 +0400
++++ gcc-4.4.7.illumos/intl/configure 2012-09-27 21:11:00.000000000 +0400
+@@ -1557,8 +1557,8 @@
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+- if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+- (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
++ if $ac_dir/$ac_word /dev/null >/dev/null 2>&1 &&
++ (if $ac_dir/$ac_word /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+@@ -1761,8 +1761,8 @@
+
+
+ if test "$GMSGFMT" != ":"; then
+- if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+- (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
++ if $GMSGFMT /dev/null >/dev/null 2>&1 &&
++ (if $GMSGFMT /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+Только в gcc-4.4.7.illumos/libcpp: ChangeLog.orig
+diff -dubr gcc-4.4.7/libcpp/directives.c gcc-4.4.7.illumos/libcpp/directives.c
+--- gcc-4.4.7/libcpp/directives.c 2011-01-05 02:18:52.000000000 +0300
++++ gcc-4.4.7.illumos/libcpp/directives.c 2012-09-27 21:11:00.000000000 +0400
+@@ -152,11 +152,11 @@
+ D(pragma, T_PRAGMA, STDC89, IN_I) /* 195 */ \
+ D(warning, T_WARNING, EXTENSION, 0) /* 22 */ \
+ D(include_next, T_INCLUDE_NEXT, EXTENSION, INCL | EXPAND) /* 19 */ \
+-D(ident, T_IDENT, EXTENSION, IN_I | DEPRECATED) /* 11 */ \
++D(ident, T_IDENT, EXTENSION, IN_I) /* 11 */ \
+ D(import, T_IMPORT, EXTENSION, INCL | EXPAND) /* 0 ObjC */ \
+ D(assert, T_ASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \
+ D(unassert, T_UNASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \
+-D(sccs, T_SCCS, EXTENSION, IN_I | DEPRECATED) /* 0 SVR4? */
++D(sccs, T_SCCS, EXTENSION, IN_I) /* 0 SVR4? */
+
+ /* #sccs is synonymous with #ident. */
+ #define do_sccs do_ident
+diff -dubr gcc-4.4.7/libstdc++-v3/acinclude.m4 gcc-4.4.7.illumos/libstdc++-v3/acinclude.m4
+--- gcc-4.4.7/libstdc++-v3/acinclude.m4 2009-05-06 13:00:57.000000000 +0400
++++ gcc-4.4.7.illumos/libstdc++-v3/acinclude.m4 2012-09-27 21:11:00.000000000 +0400
+@@ -2444,7 +2444,11 @@
+ old_CXXFLAGS="$CXXFLAGS"
+
+ # Compile unoptimized.
+- CXXFLAGS='-O0 -S'
++ # XXX: On sparc, use the lowest practical CPU level # to avoid false positives
++ case $host in
++ sparc*-*solaris*) CXXFLAGGS='-O0 -S -mcpu=v8';;
++ *) CXXFLAGS='-O0 -S';;
++ esac
+
+ # Fake what AC_TRY_COMPILE does, without linking as this is
+ # unnecessary for a builtins test.
+diff -dubr gcc-4.4.7/libstdc++-v3/configure gcc-4.4.7.illumos/libstdc++-v3/configure
+--- gcc-4.4.7/libstdc++-v3/configure 2009-08-26 23:04:11.000000000 +0400
++++ gcc-4.4.7.illumos/libstdc++-v3/configure 2012-09-27 21:11:00.000000000 +0400
+@@ -14758,7 +14758,11 @@
+ old_CXXFLAGS="$CXXFLAGS"
+
+ # Compile unoptimized.
+- CXXFLAGS='-O0 -S'
++ # XXX: On sparc, use the lowest practical CPU level # to avoid false positives
++ case $host in
++ sparc*-*solaris*) CXXFLAGS='-O0 -S -mcpu=v8';;
++ *) CXXFLAGS='-O0 -S';;
++ esac
+
+ # Fake what AC_TRY_COMPILE does, without linking as this is
+ # unnecessary for a builtins test.
+Только в gcc-4.4.7.illumos/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char: 12.cc.orig