OSDN Git Service

2009-02-20 Mark Mitchell <mark@codesourcery.com>
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Feb 2009 15:19:38 +0000 (15:19 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Feb 2009 15:19:38 +0000 (15:19 +0000)
            Joseph Myers  <joseph@codesourcery.com>

* config/arm/arm.c (arm_builtin_va_list): New function.
(arm_expand_builtin_va_start): Likewise.
(arm_gimplify_va_arg_expr): Likewise.
(TARGET_BUILD_BUILTIN_VA_LIST): Define.
(TARGET_BUILD_BUILTIN_VA_START): Likewise.
(TARGET_BUILD_BUILTIN_VA_ARG_EXPR): Likewise.
(va_list_type): New variable.
(arm_mangle_type): Mangle va_list_type appropriately.

testsuite:
* gcc.target/arm/va_list.c: New test.
* g++.dg/abi/arm_va_list.C: Likewise.
* lib/target-supports.exp (check_effective_target_arm_eabi): New
function.
* g++.dg/cpp0x/temp-va-arg-bug.C, g++.dg/other/stdarg1.C,
g++.dg/warn/miss-format-1.C, g++.dg/warn/miss-format-3.C,
g++.dg/warn/miss-format-4.C, g++.dg/warn/miss-format-5.C,
g++.dg/warn/miss-format-6.C, g++.old-deja/g++.other/vaarg2.C,
g++.old-deja/g++.other/vaarg3.C, g++.old-deja/g++.other/vaarg4.C,
g++.old-deja/g++.pt/builtin.C: Use -Wno-abi on ARM EABI targets.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144323 138bc75d-0d04-0410-961f-82ee72b054a4

17 files changed:
gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/arm_va_list.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C
gcc/testsuite/g++.dg/other/stdarg1.C
gcc/testsuite/g++.dg/warn/miss-format-1.C
gcc/testsuite/g++.dg/warn/miss-format-3.C
gcc/testsuite/g++.dg/warn/miss-format-4.C
gcc/testsuite/g++.dg/warn/miss-format-5.C
gcc/testsuite/g++.dg/warn/miss-format-6.C
gcc/testsuite/g++.old-deja/g++.other/vaarg2.C
gcc/testsuite/g++.old-deja/g++.other/vaarg3.C
gcc/testsuite/g++.old-deja/g++.other/vaarg4.C
gcc/testsuite/g++.old-deja/g++.pt/builtin.C
gcc/testsuite/gcc.target/arm/va_list.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index bb0ad68..70871ff 100644 (file)
@@ -1,3 +1,15 @@
+2009-02-20  Mark Mitchell  <mark@codesourcery.com>
+            Joseph Myers  <joseph@codesourcery.com>
+
+       * config/arm/arm.c (arm_builtin_va_list): New function.
+       (arm_expand_builtin_va_start): Likewise.
+       (arm_gimplify_va_arg_expr): Likewise.
+       (TARGET_BUILD_BUILTIN_VA_LIST): Define.
+       (TARGET_BUILD_BUILTIN_VA_START): Likewise.
+       (TARGET_BUILD_BUILTIN_VA_ARG_EXPR): Likewise.
+       (va_list_type): New variable.
+       (arm_mangle_type): Mangle va_list_type appropriately.
+
 2009-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/39157
index ddcdf5a..772f1fc 100644 (file)
@@ -186,6 +186,9 @@ static void arm_cxx_determine_class_data_visibility (tree);
 static bool arm_cxx_class_data_always_comdat (void);
 static bool arm_cxx_use_aeabi_atexit (void);
 static void arm_init_libfuncs (void);
+static tree arm_build_builtin_va_list (void);
+static void arm_expand_builtin_va_start (tree, rtx);
+static tree arm_gimplify_va_arg_expr (tree, tree, tree *, tree *);
 static bool arm_handle_option (size_t, const char *, int);
 static void arm_target_help (void);
 static unsigned HOST_WIDE_INT arm_shift_truncation_mask (enum machine_mode);
@@ -383,6 +386,13 @@ static bool arm_allocate_stack_slots_for_args (void);
 #undef TARGET_MANGLE_TYPE
 #define TARGET_MANGLE_TYPE arm_mangle_type
 
+#undef TARGET_BUILD_BUILTIN_VA_LIST
+#define TARGET_BUILD_BUILTIN_VA_LIST arm_build_builtin_va_list
+#undef TARGET_EXPAND_BUILTIN_VA_START
+#define TARGET_EXPAND_BUILTIN_VA_START arm_expand_builtin_va_start
+#undef TARGET_GIMPLIFY_VA_ARG_EXPR
+#define TARGET_GIMPLIFY_VA_ARG_EXPR arm_gimplify_va_arg_expr
+
 #ifdef HAVE_AS_TLS
 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
 #define TARGET_ASM_OUTPUT_DWARF_DTPREL arm_output_dwarf_dtprel
@@ -914,6 +924,93 @@ arm_init_libfuncs (void)
   set_optab_libfunc (umod_optab, SImode, NULL);
 }
 
+/* On AAPCS systems, this is the "struct __va_list".  */
+static GTY(()) tree va_list_type;
+
+/* Return the type to use as __builtin_va_list.  */
+static tree
+arm_build_builtin_va_list (void)
+{
+  tree va_list_name;
+  tree ap_field;
+  
+  if (!TARGET_AAPCS_BASED)
+    return std_build_builtin_va_list ();
+
+  /* AAPCS \S 7.1.4 requires that va_list be a typedef for a type
+     defined as:
+
+       struct __va_list 
+       {
+        void *__ap;
+       };
+
+     The C Library ABI further reinforces this definition in \S
+     4.1.
+
+     We must follow this definition exactly.  The structure tag
+     name is visible in C++ mangled names, and thus forms a part
+     of the ABI.  The field name may be used by people who
+     #include <stdarg.h>.  */
+  /* Create the type.  */
+  va_list_type = lang_hooks.types.make_type (RECORD_TYPE);
+  /* Give it the required name.  */
+  va_list_name = build_decl (TYPE_DECL,
+                            get_identifier ("__va_list"),
+                            va_list_type);
+  DECL_ARTIFICIAL (va_list_name) = 1;
+  TYPE_NAME (va_list_type) = va_list_name;
+  /* Create the __ap field.  */
+  ap_field = build_decl (FIELD_DECL, 
+                        get_identifier ("__ap"),
+                        ptr_type_node);
+  DECL_ARTIFICIAL (ap_field) = 1;
+  DECL_FIELD_CONTEXT (ap_field) = va_list_type;
+  TYPE_FIELDS (va_list_type) = ap_field;
+  /* Compute its layout.  */
+  layout_type (va_list_type);
+
+  return va_list_type;
+}
+
+/* Return an expression of type "void *" pointing to the next
+   available argument in a variable-argument list.  VALIST is the
+   user-level va_list object, of type __builtin_va_list.  */
+static tree
+arm_extract_valist_ptr (tree valist)
+{
+  if (TREE_TYPE (valist) == error_mark_node)
+    return error_mark_node;
+
+  /* On an AAPCS target, the pointer is stored within "struct
+     va_list".  */
+  if (TARGET_AAPCS_BASED)
+    {
+      tree ap_field = TYPE_FIELDS (TREE_TYPE (valist));
+      valist = build3 (COMPONENT_REF, TREE_TYPE (ap_field), 
+                      valist, ap_field, NULL_TREE);
+    }
+
+  return valist;
+}
+
+/* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
+static void
+arm_expand_builtin_va_start (tree valist, rtx nextarg)
+{
+  valist = arm_extract_valist_ptr (valist);
+  std_expand_builtin_va_start (valist, nextarg);
+}
+
+/* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
+static tree
+arm_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, 
+                         tree *post_p)
+{
+  valist = arm_extract_valist_ptr (valist);
+  return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
+}
+
 /* Implement TARGET_HANDLE_OPTION.  */
 
 static bool
@@ -19506,6 +19603,21 @@ arm_mangle_type (const_tree type)
 {
   arm_mangle_map_entry *pos = arm_mangle_map;
 
+  /* The ARM ABI documents (10th October 2008) say that "__va_list"
+     has to be managled as if it is in the "std" namespace.  */
+  if (TARGET_AAPCS_BASED 
+      && lang_hooks.types_compatible_p (type, va_list_type))
+    {
+      static bool warned;
+      if (!warned && warn_psabi)
+       {
+         warned = true;
+         inform (input_location,
+                 "the mangling of %<va_list%> has changed in GCC 4.4");
+       }
+      return "St9__va_list";
+    }
+
   if (TREE_CODE (type) != VECTOR_TYPE)
     return NULL;
 
index 9505f9b..866f6ae 100644 (file)
@@ -1,3 +1,17 @@
+2009-02-20  Mark Mitchell  <mark@codesourcery.com>
+            Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.target/arm/va_list.c: New test.
+       * g++.dg/abi/arm_va_list.C: Likewise.
+       * lib/target-supports.exp (check_effective_target_arm_eabi): New
+       function.
+       * g++.dg/cpp0x/temp-va-arg-bug.C, g++.dg/other/stdarg1.C,
+       g++.dg/warn/miss-format-1.C, g++.dg/warn/miss-format-3.C,
+       g++.dg/warn/miss-format-4.C, g++.dg/warn/miss-format-5.C,
+       g++.dg/warn/miss-format-6.C, g++.old-deja/g++.other/vaarg2.C,
+       g++.old-deja/g++.other/vaarg3.C, g++.old-deja/g++.other/vaarg4.C,
+       g++.old-deja/g++.pt/builtin.C: Use -Wno-abi on ARM EABI targets.
+
 2009-02-20  Jack Howarth  <howarth@bromo.med.uc.edu>
 
        PR testsuite/38164
diff --git a/gcc/testsuite/g++.dg/abi/arm_va_list.C b/gcc/testsuite/g++.dg/abi/arm_va_list.C
new file mode 100644 (file)
index 0000000..45a426a
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wno-abi" }
+// { dg-require-effective-target arm_eabi }
+
+// AAPCS \S 7.1.4 requires that va_list be a typedef for "struct
+// __va_list".  The mangling is as if it were "std::__va_list".
+// #include <stdarg.h>
+typedef __builtin_va_list va_list;
+
+// { dg-final { scan-assembler "\n_Z1fPSt9__va_list:" } }
+void f(va_list*) {}
+
+// { dg-final { scan-assembler "\n_Z1gSt9__va_listS_:" } }
+void g(va_list, va_list) {}
index 5314b24..085915f 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-options "--std=c++0x" }
+// { dg-options "-Wno-abi --std=c++0x" { target arm_eabi } }
 #include <stdarg.h>
 
 struct S { };
index e005199..1ac9e8f 100644 (file)
@@ -1,5 +1,6 @@
 // Test stdarg function with anonymous argument
 // { dg-do run }
+// { dg-options "-Wno-abi" { target arm_eabi } }
 
 #include <stdarg.h>
 
index faa3583..9d99cdb 100644 (file)
@@ -2,6 +2,7 @@
 /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
 /* { dg-do compile } */
 /* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
 /* VxWorks does not provide vscanf, either in kernel or RTP mode.  */
 /* { dg-error "not declared" "" { target *-*-solaris2.[7-8] *-*-vxworks* } 25 } */
 
index 0f61400..d131d15 100644 (file)
@@ -2,6 +2,7 @@
 /* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
 /* { dg-do compile } */
 /* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
 
 #include <stdarg.h>
 
index 1a89abd..73db0d5 100644 (file)
@@ -2,6 +2,7 @@
 /* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
 /* { dg-do compile } */
 /* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
 
 #include <stdarg.h>
 
index 452e812..cbc27b5 100644 (file)
@@ -2,6 +2,7 @@
 /* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
 /* { dg-do compile } */
 /* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
 
 #include <stdarg.h>
 
index f38e4ca..f78dbdf 100644 (file)
@@ -2,6 +2,7 @@
 /* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
 /* { dg-do compile } */
 /* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
 
 #include <stdarg.h>
 
index 2992a25..278f537 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do run  }
+// { dg-options "-Wno-abi" { target arm_eabi } }
 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 4 Oct 1999 <nathan@acm.org>
 
index 8ed6df7..f852b08 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-options "-Wno-abi" { target arm_eabi } }
 
 // Copyright (C) 1999 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 4 Oct 1999 <nathan@acm.org>
@@ -21,10 +22,10 @@ void fn1(va_list args)
   const Z &z2 = va_arg (args, Z);       // { dg-error "incomplete" } 
 
   va_arg (args, char);    // { dg-warning "promote" } 
-  // { dg-message "should pass" "pass" { target *-*-* } 23 }
-  // { dg-message "abort" "abort" { target *-*-* } 23 }
+  // { dg-message "should pass" "pass" { target *-*-* } 24 }
+  // { dg-message "abort" "abort" { target *-*-* } 24 }
   va_arg (args, int []);  // { dg-error "array with unspecified bounds" } promote
   va_arg (args, int ());  // { dg-warning "non-POD" } promote
   va_arg (args, bool);    // { dg-warning "promote" "promote" } 
-  // { dg-message "abort" "abort" { target *-*-* } 28 }
+  // { dg-message "abort" "abort" { target *-*-* } 29 }
 }
index 3f08b0a..9ea165b 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-options "-Wno-abi" { target arm_eabi } }
 
 // Bug 845. We were treating __builtin_va_arg as a unary expr, not a primary,
 // and hence getting parse errors.
index cd79d8a..0a2e241 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-options "-Wno-abi" { target arm_eabi } }
 // Bug: Checking whether A depends on template parms, we crash because
 // __builtin_va_list lacks TYPE_LANG_SPECIFIC.
 
diff --git a/gcc/testsuite/gcc.target/arm/va_list.c b/gcc/testsuite/gcc.target/arm/va_list.c
new file mode 100644 (file)
index 0000000..b988a0d
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-require-effective-target arm_eabi } */
+
+#include <stdarg.h>
+#include <stddef.h>
+
+/* AAPCS \S 7.1.4 requires that va_list match the structure shown
+   here */
+typedef struct my_va_list 
+{
+  void *ap;
+} my_va_list;
+
+int 
+main () {
+  if (sizeof (va_list) != sizeof (my_va_list))
+    return 1;
+  /* This check confirms both that "va_list" has a member named "__ap"
+     and that it is located at the correct position.  */
+  if (offsetof (va_list, __ap) 
+      != offsetof (my_va_list, ap))
+    return 2;
+
+  return 0;
+}
index 12dc685..03c1779 100644 (file)
@@ -1451,6 +1451,19 @@ proc check_effective_target_mips_loongson { } {
     }]
 }
 
+# Return 1 if this is an ARM target that adheres to the ABI for the ARM
+# Architecture.
+
+proc check_effective_target_arm_eabi { } {
+    return [check_no_compiler_messages arm_eabi object {
+       #ifndef __ARM_EABI__
+       #error not EABI
+       #else
+       int dummy;
+       #endif
+    }]
+}
+
 # Return 1 if this is a PowerPC target with floating-point registers.
 
 proc check_effective_target_powerpc_fprs { } {