aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c b/gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c
new file mode 100644
index 000000000..b86801032
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/i386/asm-4.c
@@ -0,0 +1,47 @@
+/* Test if functions marked __attribute__((used)), but with address never
+ taken in C code, don't use alternate calling convention for local
+ functions on IA-32. */
+/* { dg-do run } */
+/* The asm in this test uses an absolute address. */
+/* { dg-require-effective-target nonpic } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+static int foo (int, int, int, int) __asm ("foo");
+static __attribute__((noinline, used)) int
+foo (int i, int j, int k, int l)
+{
+ return i + j + k + l;
+}
+
+void
+bar (void)
+{
+ if (foo (1, 2, 3, 4) != 10)
+ abort ();
+}
+
+int (*fn) (int, int, int, int);
+
+void
+baz (void)
+{
+ /* Darwin loads 64-bit regions above the 4GB boundary so
+ we need to use this instead. */
+#if defined (__LP64__) && defined (__MACH__)
+ __asm ("leaq foo(%%rip), %0" : "=r" (fn));
+#else
+ __asm ("movl $foo, %k0" : "=r" (fn));
+#endif
+ if (fn (2, 3, 4, 5) != 14)
+ abort ();
+}
+
+int
+main (void)
+{
+ bar ();
+ baz ();
+ return 0;
+}