Fix several issues with compiler extensions
authorserge-sans-paille <sguelton@redhat.com>
Fri, 10 Jan 2020 09:05:30 +0000 (10:05 +0100)
committerserge-sans-paille <sguelton@redhat.com>
Fri, 10 Jan 2020 09:10:20 +0000 (10:10 +0100)
- Update documentation now that the move to monorepo has been made
- Do not tie compiler extension testing to LLVM_BUILD_EXAMPLES
- No need to specify LLVM libraries for plugins
- Add NO_MODULE option to match Polly specific requirements (i.e. building the
  module *and* linking it statically)
- Issue a warning when building the compiler extension with
  LLVM_BYE_LINK_INTO_TOOLS=ON, as it modifies the behavior of clang, which only
  makes sense for testing purpose.

Still mark llvm/test/Feature/load_extension.ll as XFAIL because of a
ManagedStatic dependency that's going to be fixed in a seperate commit.

Differential Revision: https://reviews.llvm.org/D72327

llvm/cmake/modules/AddLLVM.cmake
llvm/examples/Bye/CMakeLists.txt
llvm/test/lit.cfg.py
polly/lib/CMakeLists.txt

index 75e0f10..fce36ba 100644 (file)
@@ -847,32 +847,40 @@ macro(add_llvm_executable name)
   llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
 endmacro(add_llvm_executable name)
 
-# add_llvm_pass_plugin(name)
+# add_llvm_pass_plugin(name [NO_MODULE] ...)
 #   Add ${name} as an llvm plugin.
 #   If option LLVM_${name_upper}_LINK_INTO_TOOLS is set to ON, the plugin is registered statically.
 #   Otherwise a pluggable shared library is registered.
+#
+#   If NO_MODULE is specified, when option LLVM_${name_upper}_LINK_INTO_TOOLS is set to OFF,
+#   only an object library is built, and no module is built. This is specific to the Polly use case.
 function(add_llvm_pass_plugin name)
+  cmake_parse_arguments(ARG
+    "NO_MODULE" "" ""
+    ${ARGN})
 
   string(TOUPPER ${name} name_upper)
 
   option(LLVM_${name_upper}_LINK_INTO_TOOLS "Statically link ${name} into tools (if available)" OFF)
 
-  # process_llvm_pass_plugins takes care of the actual linking, just create an
-  # object library as of now
-  add_llvm_library(${name} OBJECT ${ARGN})
-
-  if(LLVM_${name_upper}_LINK_INTO_TOOLS)
-      target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS)
-      set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS)
-      if (TARGET intrinsics_gen)
-        add_dependencies(obj.${name} intrinsics_gen)
-      endif()
-  endif()
-
-  message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})")
   if(LLVM_${name_upper}_LINK_INTO_TOOLS)
+    list(REMOVE_ITEM ARG_UNPARSED_ARGUMENTS BUILDTREE_ONLY)
+    # process_llvm_pass_plugins takes care of the actual linking, just create an
+    # object library as of now
+    add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS})
+    target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS)
+    set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS)
+    if (TARGET intrinsics_gen)
+      add_dependencies(obj.${name} intrinsics_gen)
+    endif()
+    message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})")
     set_property(GLOBAL APPEND PROPERTY LLVM_COMPILE_EXTENSIONS ${name})
+  elseif(NOT ARG_NO_MODULE)
+    add_llvm_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS})
+  else()
+    add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS})
   endif()
+
 endfunction(add_llvm_pass_plugin)
 
 # Generate X Macro file for extension handling. It provides a
index a676720..3206f90 100644 (file)
@@ -1,23 +1,13 @@
-add_llvm_pass_plugin(Bye
-    Bye.cpp
-    DEPENDS
-    intrinsics_gen
-    BUILDTREE_ONLY
-    )
-
-if (LLVM_LINK_LLVM_DYLIB)
-  target_link_libraries(Bye PUBLIC LLVM)
-else()
-  target_link_libraries(Bye
-    PUBLIC
-    LLVMSupport
-    LLVMCore
-    LLVMipo
-    LLVMPasses
-    )
+if(LLVM_BYE_LINK_INTO_TOOLS)
+  message(WARNING "Setting LLVM_BYE_LINK_INTO_TOOLS=ON only makes sense for testing purpose")
 endif()
 
-if( LLVM_BUILD_EXAMPLES )
-  install(TARGETS ${name} RUNTIME DESTINATION examples)
-endif()
+add_llvm_pass_plugin(Bye
+  Bye.cpp
+  DEPENDS
+  intrinsics_gen
+  BUILDTREE_ONLY
+ )
+
+install(TARGETS ${name} RUNTIME DESTINATION examples)
 set_target_properties(${name} PROPERTIES FOLDER "Examples")
index e785b22..b57b87a 100644 (file)
@@ -200,13 +200,13 @@ if config.has_plugins:
 if config.build_examples:
     config.available_features.add('examples')
 
-if config.linked_bye_extension and config.build_examples:
+if config.linked_bye_extension:
     config.substitutions.append(('%llvmcheckext', 'CHECK-EXT'))
     config.substitutions.append(('%loadbye', ''))
 else:
     config.substitutions.append(('%llvmcheckext', 'CHECK-NOEXT'))
     config.substitutions.append(('%loadbye',
-                                 '-load={}/libBye{}'.format(config.llvm_shlib_dir,
+                                 '-load={}/Bye{}'.format(config.llvm_shlib_dir,
                                                                   config.llvm_shlib_ext)))
 
 # Static libraries are not built if BUILD_SHARED_LIBS is ON.
index 9e8cd19..ee0834c 100644 (file)
@@ -24,6 +24,7 @@ endif ()
 # Use an object-library to add the same files to multiple libs without requiring
 # the sources them to be recompiled for each of them.
 add_llvm_pass_plugin(Polly
+  NO_MODULE
   Analysis/DependenceInfo.cpp
   Analysis/PolyhedralInfo.cpp
   Analysis/ScopDetection.cpp