[llvm-commits] [llvm] r74000 - in /llvm/trunk: Makefile.rules include/llvm/CompilerDriver/ForceLinkage.h include/llvm/CompilerDriver/ForceLinkageMacros.h include/llvm/CompilerDriver/Main.inc tools/llvmc/driver/Makefile utils/TableGen/LLVMCConfigurationEmitter.cpp

Mikhail Glushenkov foldr at codedgers.com
Tue Jun 23 13:46:48 PDT 2009


Author: foldr
Date: Tue Jun 23 15:46:48 2009
New Revision: 74000

URL: http://llvm.org/viewvc/llvm-project?rev=74000&view=rev
Log:
Make llvmc work again.

Chris recently broke llvmc with his Makefile changes (r75379). That patch made
the global change .o -> .a, which caused built-in llvmc plugins to stop working
since plugin initialization in llvmc is based on static variables not referenced
from the main executable. This patch implements auto-generated forced references
to the plugin libraries.

Added:
    llvm/trunk/include/llvm/CompilerDriver/ForceLinkage.h
    llvm/trunk/include/llvm/CompilerDriver/ForceLinkageMacros.h
Modified:
    llvm/trunk/Makefile.rules
    llvm/trunk/include/llvm/CompilerDriver/Main.inc
    llvm/trunk/tools/llvmc/driver/Makefile
    llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp

Modified: llvm/trunk/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=74000&r1=73999&r2=74000&view=diff

==============================================================================
--- llvm/trunk/Makefile.rules (original)
+++ llvm/trunk/Makefile.rules Tue Jun 23 15:46:48 2009
@@ -198,6 +198,7 @@
 ifdef LLVMC_PLUGIN
 
 LIBRARYNAME := $(patsubst %,plugin_llvmc_%,$(LLVMC_PLUGIN))
+CPP.Flags += -DLLVMC_PLUGIN_NAME=$(LLVMC_PLUGIN)
 REQUIRES_EH := 1
 
 # Build a dynamic library if the user runs `make` directly from the plugin

Added: llvm/trunk/include/llvm/CompilerDriver/ForceLinkage.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/ForceLinkage.h?rev=74000&view=auto

==============================================================================
--- llvm/trunk/include/llvm/CompilerDriver/ForceLinkage.h (added)
+++ llvm/trunk/include/llvm/CompilerDriver/ForceLinkage.h Tue Jun 23 15:46:48 2009
@@ -0,0 +1,82 @@
+//===--- ForceLinkage.h - The LLVM Compiler Driver --------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open
+// Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  A bit of preprocessor magic to force references to static libraries. Needed
+//  because plugin initialization is done via static variables.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H
+#define LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H
+
+#include "llvm/CompilerDriver/ForceLinkageMacros.h"
+
+namespace llvmc {
+
+// Declare all ForceLinkage$(PluginName) functions.
+
+#ifdef LLVMC_BUILTIN_PLUGIN_1
+      LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_1);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_2
+      LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_2);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_3
+      LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_3);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_4
+      LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_4);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_5
+      LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_5);
+#endif
+
+namespace force_linkage {
+
+  struct LinkageForcer {
+
+    LinkageForcer() {
+
+// Call all ForceLinkage$(PluginName) functions.
+#ifdef LLVMC_BUILTIN_PLUGIN_1
+      LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_1);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_2
+      LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_2);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_3
+      LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_3);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_4
+      LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_4);
+#endif
+
+#ifdef LLVMC_BUILTIN_PLUGIN_5
+      LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_5);
+#endif
+
+    }
+  };
+} // End namespace force_linkage.
+
+// The only externally used bit.
+void ForceLinkage() {
+  force_linkage::LinkageForcer dummy;
+}
+
+} // End namespace llvmc.
+
+#endif // LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H

Added: llvm/trunk/include/llvm/CompilerDriver/ForceLinkageMacros.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/ForceLinkageMacros.h?rev=74000&view=auto

==============================================================================
--- llvm/trunk/include/llvm/CompilerDriver/ForceLinkageMacros.h (added)
+++ llvm/trunk/include/llvm/CompilerDriver/ForceLinkageMacros.h Tue Jun 23 15:46:48 2009
@@ -0,0 +1,29 @@
+//===--- ForceLinkageMacros.h - The LLVM Compiler Driver --------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open
+// Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  Preprocessor magic that forces references to static libraries - common
+//  macros used by both driver and plugins.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_MACROS_H
+#define LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_MACROS_H
+
+#define LLVMC_FORCE_LINKAGE_PREFIX(PluginName) ForceLinkage ## PluginName
+
+#define LLVMC_FORCE_LINKAGE_FUN(PluginName) \
+  LLVMC_FORCE_LINKAGE_PREFIX(PluginName)
+
+#define LLVMC_FORCE_LINKAGE_DECL(PluginName) \
+  void LLVMC_FORCE_LINKAGE_FUN(PluginName) ()
+
+#define LLVMC_FORCE_LINKAGE_CALL(PluginName) \
+  LLVMC_FORCE_LINKAGE_FUN(PluginName) ()
+
+#endif // LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_MACROS_H

Modified: llvm/trunk/include/llvm/CompilerDriver/Main.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Main.inc?rev=74000&r1=73999&r2=74000&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CompilerDriver/Main.inc (original)
+++ llvm/trunk/include/llvm/CompilerDriver/Main.inc Tue Jun 23 15:46:48 2009
@@ -19,6 +19,7 @@
 
 #include "llvm/CompilerDriver/CompilationGraph.h"
 #include "llvm/CompilerDriver/Error.h"
+#include "llvm/CompilerDriver/ForceLinkage.h"
 #include "llvm/CompilerDriver/Plugin.h"
 
 #include "llvm/System/Path.h"
@@ -85,6 +86,8 @@
 
 int main(int argc, char** argv) {
   try {
+    ForceLinkage();
+
     LanguageMap langMap;
     CompilationGraph graph;
 

Modified: llvm/trunk/tools/llvmc/driver/Makefile
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/driver/Makefile?rev=74000&r1=73999&r2=74000&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc/driver/Makefile (original)
+++ llvm/trunk/tools/llvmc/driver/Makefile Tue Jun 23 15:46:48 2009
@@ -8,15 +8,46 @@
 ##===----------------------------------------------------------------------===##
 
 LEVEL = ../../..
+include $(LEVEL)/Makefile.config
 
 TOOLNAME = $(LLVMC_BASED_DRIVER_NAME)
 LLVMLIBS = CompilerDriver.a
+LINK_COMPONENTS = support system
+REQUIRES_EH := 1
 
+# Preprocessor magic that generates references to static variables in built-in
+# plugins.
+# TODO: Move this to Makefile.rules? (also used by examples/{Skeleton, mcc16})
 ifneq ($(LLVMC_BUILTIN_PLUGINS),)
+
 USEDLIBS += $(patsubst %,plugin_llvmc_%.a,$(LLVMC_BUILTIN_PLUGINS))
+
+LLVMC_BUILTIN_PLUGIN_1 = $(word 1, $(LLVMC_BUILTIN_PLUGINS))
+LLVMC_BUILTIN_PLUGIN_2 = $(word 2, $(LLVMC_BUILTIN_PLUGINS))
+LLVMC_BUILTIN_PLUGIN_3 = $(word 3, $(LLVMC_BUILTIN_PLUGINS))
+LLVMC_BUILTIN_PLUGIN_4 = $(word 4, $(LLVMC_BUILTIN_PLUGINS))
+LLVMC_BUILTIN_PLUGIN_5 = $(word 5, $(LLVMC_BUILTIN_PLUGINS))
+
+ifneq ($(LLVMC_BUILTIN_PLUGIN_1),)
+CPP.Flags += -DLLVMC_BUILTIN_PLUGIN_1=$(LLVMC_BUILTIN_PLUGIN_1)
 endif
 
-LINK_COMPONENTS = support system
-REQUIRES_EH := 1
+ifneq ($(LLVMC_BUILTIN_PLUGIN_2),)
+CPP.Flags += -DLLVMC_BUILTIN_PLUGIN_2=$(LLVMC_BUILTIN_PLUGIN_2)
+endif
+
+ifneq ($(LLVMC_BUILTIN_PLUGIN_3),)
+CPP.Flags += -DLLVMC_BUILTIN_PLUGIN_3=$(LLVMC_BUILTIN_PLUGIN_3)
+endif
+
+ifneq ($(LLVMC_BUILTIN_PLUGIN_4),)
+CPP.Flags += -DLLVMC_BUILTIN_PLUGIN_4=$(LLVMC_BUILTIN_PLUGIN_4)
+endif
+
+ifneq ($(LLVMC_BUILTIN_PLUGIN_5),)
+CPP.Flags += -DLLVMC_BUILTIN_PLUGIN_5=$(LLVMC_BUILTIN_PLUGIN_5)
+endif
+
+endif
 
 include $(LEVEL)/Makefile.common

Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp?rev=74000&r1=73999&r2=74000&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Tue Jun 23 15:46:48 2009
@@ -1984,6 +1984,7 @@
 /// additional declarations.
 void EmitIncludes(std::ostream& O) {
   O << "#include \"llvm/CompilerDriver/CompilationGraph.h\"\n"
+    << "#include \"llvm/CompilerDriver/ForceLinkageMacros.h\"\n"
     << "#include \"llvm/CompilerDriver/Plugin.h\"\n"
     << "#include \"llvm/CompilerDriver/Tool.h\"\n\n"
 
@@ -2106,7 +2107,13 @@
   // Emit code for plugin registration.
   EmitRegisterPlugin(Data.Priority, O);
 
-  O << "} // End anonymous namespace.\n";
+  O << "} // End anonymous namespace.\n\n";
+
+  // Force linkage magic.
+  O << "namespace llvmc {\n";
+  O << "LLVMC_FORCE_LINKAGE_DECL(LLVMC_PLUGIN_NAME) {}\n";
+  O << "}\n";
+
   // EOF
 }
 





More information about the llvm-commits mailing list