pkgsrc/lang/g95/patches/patch-libf95.a-0.93_runtime_main.c
2014-02-17 16:49:14 +00:00

59 lines
1.5 KiB
C

$NetBSD: patch-libf95.a-0.93_runtime_main.c,v 1.3 2014/02/17 16:49:14 jperkin Exp $
* fixes missing restore stack address. PR pkg/47906
* Make MAIN_ weak to allow linking libf95 dynamically.
--- libf95.a-0.93/runtime/main.c.orig 2010-04-18 15:47:28.000000000 +0000
+++ libf95.a-0.93/runtime/main.c
@@ -37,11 +37,14 @@
void __main(void) {}
#endif
-
-
-
/* main()-- Entry point for the fortran program */
-void MAIN_(void);
+#ifdef __APPLE__
+void MAIN_(void);
+#elif __GNUC__ - 0 == 4 && __GNUC_MINOR__ < 2
+extern void weak_MAIN_(void) __attribute__((__weakref__("MAIN_")));
+#else
+static void weak_MAIN_(void) __attribute__((__weakref__("MAIN_")));
+#endif
int main(int argc, char *argv[]) {
@@ -50,17 +53,30 @@ int main(int argc, char *argv[]) {
* unaligned. */
#if HAVE_REAL_10 == 1 || HAVE_REAL_10 == 2
+ int diff;
asm("mov %%esp, %%eax\n"
"and $0x04, %%eax\n"
- "sub %%eax, %%esp\n" : : : "%eax");
+ "movl %%eax, %0\n"
+ "sub %%eax, %%esp\n" : "=r"(diff) : : "%eax");
#endif
g95_runtime_start(argc, argv);
- MAIN_(); /* Call the Fortran main program. */
+#ifdef __APPLE__
+ if (MAIN_)
+ MAIN_(); /* Call the Fortran main program. */
+#else
+ if (weak_MAIN_)
+ weak_MAIN_(); /* Call the Fortran main program. */
+#endif
memory_done();
g95_runtime_stop();
+#if HAVE_REAL_10 == 1 || HAVE_REAL_10 == 2
+ asm("mov %0, %%eax\n"
+ "add %%eax, %%esp\n" : : "r"(diff) : "%eax");
+#endif
+
return 0;
}