[Attributor][modulemap] Revert r368064 but fix the build
authorKristina Brooks <notstina@gmail.com>
Tue, 6 Aug 2019 19:53:19 +0000 (19:53 +0000)
committerKristina Brooks <notstina@gmail.com>
Tue, 6 Aug 2019 19:53:19 +0000 (19:53 +0000)
Commit r368064 was necessary after r367953 (D65712) broke the module
build. That happened, apparently, because the template class IRAttribute
defined in the header had a virtual method defined in the corresponding
source file (IRAttribute::manifest). To unbreak the situation this patch
introduces a helper function IRAttributeManifest::manifestAttrs which
is used to implement IRAttribute::manifest in the header. The deifnition
of the helper function is still in the source file.

Patch by jdoerfert (Johannes Doerfert)

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

llvm-svn: 368076

llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/include/llvm/module.modulemap
llvm/lib/Transforms/IPO/Attributor.cpp

index 52c9507a8bbdbd3fb0cf24d96a4a7fb75864c97c..1129b2884acbacb60919e838e38afb20467a79cf 100644 (file)
@@ -655,9 +655,17 @@ protected:
   int AttributeIdx;
 };
 
+/// Helper struct necessary as the modular build fails if the virtual method
+/// IRAttribute::manifest is defined in the Attributor.cpp.
+struct IRAttributeManifest {
+  static ChangeStatus manifestAttrs(Attributor &A, IRPosition &IRP,
+      const ArrayRef<Attribute> &DeducedAttrs);
+};
+
 /// Helper class that provides common functionality to manifest IR attributes.
 template <Attribute::AttrKind AK, typename Base>
-struct IRAttribute : public IRPosition, public Base {
+struct IRAttribute : public IRPosition, public Base, public IRAttributeManifest {
+  ~IRAttribute() {}
 
   /// Constructors for the IRPosition.
   ///
@@ -666,7 +674,11 @@ struct IRAttribute : public IRPosition, public Base {
   ///}
 
   /// See AbstractAttribute::manifest(...).
-  virtual ChangeStatus manifest(Attributor &A);
+  ChangeStatus manifest(Attributor &A) {
+    SmallVector<Attribute, 4> DeducedAttrs;
+    getDeducedAttributes(getAnchorScope().getContext(), DeducedAttrs);
+    return IRAttributeManifest::manifestAttrs(A, getIRPosition(), DeducedAttrs);
+  }
 
   /// Return the kind that identifies the abstract attribute implementation.
   Attribute::AttrKind getAttrKind() const { return AK; }
index abfbd0b6810348f7dc06fb7b5c5c268464ca9f15..ecb3b37004fd68e31df1fb49512c360f39c3f337 100644 (file)
@@ -333,11 +333,6 @@ module LLVM_Transforms {
   requires cplusplus
   umbrella "Transforms"
 
-  // FIXME: This is far from a perfect solution but at the moment this header
-  // is difficult to modularize and would require splitting it up. Exclude it
-  // completely to avoid a link failure with modular builds.
-  exclude header "Transforms/IPO/Attributor.h"
-
   module * { export * }
 }
 
index 22c6d4fa7f6add23fad869ec7e7de4447aafd74c..d98028a644531e98d4ee2b728fe6367eb9d2bb49 100644 (file)
@@ -332,21 +332,16 @@ ChangeStatus AbstractAttribute::update(Attributor &A,
   return HasChanged;
 }
 
-template <Attribute::AttrKind AK, typename Base>
-ChangeStatus IRAttribute<AK, Base>::manifest(Attributor &A) {
-  assert(this->getState().isValidState() &&
-         "Attempted to manifest an invalid state!");
-  assert(getIRPosition().getAssociatedValue() &&
+ ChangeStatus IRAttributeManifest::manifestAttrs(Attributor &A, IRPosition
+     &IRP, const ArrayRef<Attribute> &DeducedAttrs) {
+  assert(IRP.getAssociatedValue() &&
          "Attempted to manifest an attribute without associated value!");
 
   ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
 
-  Function &ScopeFn = getAnchorScope();
+  Function &ScopeFn = IRP.getAnchorScope();
   LLVMContext &Ctx = ScopeFn.getContext();
-  IRPosition::Kind PK = getPositionKind();
-
-  SmallVector<Attribute, 4> DeducedAttrs;
-  getDeducedAttributes(Ctx, DeducedAttrs);
+  IRPosition::Kind PK = IRP.getPositionKind();
 
   // In the following some generic code that will manifest attributes in
   // DeducedAttrs if they improve the current IR. Due to the different
@@ -360,12 +355,12 @@ ChangeStatus IRAttribute<AK, Base>::manifest(Attributor &A) {
     Attrs = ScopeFn.getAttributes();
     break;
   case IRPosition::IRP_CALL_SITE_ARGUMENT:
-    Attrs = ImmutableCallSite(&getAnchorValue()).getAttributes();
+    Attrs = ImmutableCallSite(&IRP.getAnchorValue()).getAttributes();
     break;
   }
 
   for (const Attribute &Attr : DeducedAttrs) {
-    if (!addIfNotExistent(Ctx, Attr, Attrs, getAttrIdx()))
+    if (!addIfNotExistent(Ctx, Attr, Attrs, IRP.getAttrIdx()))
       continue;
 
     HasChanged = ChangeStatus::CHANGED;
@@ -382,7 +377,7 @@ ChangeStatus IRAttribute<AK, Base>::manifest(Attributor &A) {
     ScopeFn.setAttributes(Attrs);
     break;
   case IRPosition::IRP_CALL_SITE_ARGUMENT:
-    CallSite(&getAnchorValue()).setAttributes(Attrs);
+    CallSite(&IRP.getAnchorValue()).setAttributes(Attrs);
   }
 
   return HasChanged;