sim/igen: Fix linker error with -fno-common
authorSebastian Huber <sebastian.huber@embedded-brains.de>
Thu, 2 Jul 2020 16:10:49 +0000 (18:10 +0200)
committerSebastian Huber <sebastian.huber@embedded-brains.de>
Fri, 3 Jul 2020 19:03:47 +0000 (21:03 +0200)
GCC 10 enables -fno-common by default.  This resulted in multiple
definition linker errors since a global variable was declared and
defined in a header file:

  ld: libsim.a(idecode.o):sim/v850/idecode.h:71: multiple definition of
  `idecode_issue'; libsim.a(irun.o):sim/v850/idecode.h:71: first defined
  here

  ld: libsim.a(engine.o):sim/v850/idecode.h:71: multiple definition of
  `idecode_issue'; libsim.a(irun.o):sim/v850/idecode.h:71: first defined
  here

  ld: libsim.a(support.o):sim/v850/idecode.h:71: multiple definition of
  `idecode_issue'; libsim.a(irun.o):sim/v850/idecode.h:71: first defined
  here

  ld: libsim.a(semantics.o):sim/v850/idecode.h:71: multiple definition
  of `idecode_issue'; libsim.a(irun.o):sim/v850/idecode.h:71: first
  defined here

sim/igen

PR sim/26194

* lf.h (lf_get_file_type): Declare.
* lf.c (lf_get_file_type): Define.
* gen-idecode.c (print_idecode_issue_function_header): Use
lf_get_file_type() to issue an extern variable declaration in
case of header files.

sim/igen/ChangeLog
sim/igen/gen-idecode.c
sim/igen/lf.c
sim/igen/lf.h

index beda37b56ea2267fec4a394e945c6bbc554534a1..f3f50f4d3fa85ad69cb0f210d3363a55c26c0a3f 100644 (file)
@@ -1,3 +1,12 @@
+2020-07-03  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+
+       PR sim/26194
+       * lf.h (lf_get_file_type): Declare.
+       * lf.c (lf_get_file_type): Define.
+       * gen-idecode.c (print_idecode_issue_function_header): Use
+       lf_get_file_type() to issue an extern variable declaration in
+       case of header files.
+
 2019-12-19  Tom Tromey  <tromey@adacore.com>
 
        PR build/24572:
index b8f8ca15061bef7e53420675ea55b5973f7bda19..741498a1be9784a857843d1c00b37d5f7447fdd7 100644 (file)
@@ -930,6 +930,8 @@ print_idecode_issue_function_header (lf *file,
                                        "INLINE_IDECODE", "\n");
       break;
     case is_function_variable:
+      if (lf_get_file_type (file) == lf_is_h)
+       lf_printf (file, "extern ");
       print_semantic_function_type (file);
       lf_printf (file, " (*");
       break;
index 0f377d48d88daa645b972bd1c69a98b1b65d5ec9..937e3d939ffdf2e0383e707356c1862f290177b2 100644 (file)
@@ -86,6 +86,13 @@ lf_open (char *name,
 }
 
 
+lf_file_type
+lf_get_file_type (const lf *file)
+{
+  return file->type;
+}
+
+
 void
 lf_close (lf *file)
 {
index 54b4dcd0de1784e03d8d3ac152f09be0269443f6..6d86fac8d3fdcb842ec1985fdade003d68b362a9 100644 (file)
@@ -54,6 +54,8 @@ extern lf *lf_open
    lf_file_references file_references,
    lf_file_type type, const char *program);
 
+extern lf_file_type lf_get_file_type (const lf *file);
+
 extern void lf_close (lf *file);