forked from OSchip/llvm-project
[Attributor][modulemap] Revert r368064 but fix the build
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
This commit is contained in:
parent
5fdf10bae8
commit
26e60f0653
|
@ -655,9 +655,17 @@ protected:
|
||||||
int AttributeIdx;
|
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.
|
/// Helper class that provides common functionality to manifest IR attributes.
|
||||||
template <Attribute::AttrKind AK, typename Base>
|
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.
|
/// Constructors for the IRPosition.
|
||||||
///
|
///
|
||||||
|
@ -666,7 +674,11 @@ struct IRAttribute : public IRPosition, public Base {
|
||||||
///}
|
///}
|
||||||
|
|
||||||
/// See AbstractAttribute::manifest(...).
|
/// 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.
|
/// Return the kind that identifies the abstract attribute implementation.
|
||||||
Attribute::AttrKind getAttrKind() const { return AK; }
|
Attribute::AttrKind getAttrKind() const { return AK; }
|
||||||
|
|
|
@ -333,11 +333,6 @@ module LLVM_Transforms {
|
||||||
requires cplusplus
|
requires cplusplus
|
||||||
umbrella "Transforms"
|
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 * }
|
module * { export * }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -332,21 +332,16 @@ ChangeStatus AbstractAttribute::update(Attributor &A,
|
||||||
return HasChanged;
|
return HasChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <Attribute::AttrKind AK, typename Base>
|
ChangeStatus IRAttributeManifest::manifestAttrs(Attributor &A, IRPosition
|
||||||
ChangeStatus IRAttribute<AK, Base>::manifest(Attributor &A) {
|
&IRP, const ArrayRef<Attribute> &DeducedAttrs) {
|
||||||
assert(this->getState().isValidState() &&
|
assert(IRP.getAssociatedValue() &&
|
||||||
"Attempted to manifest an invalid state!");
|
|
||||||
assert(getIRPosition().getAssociatedValue() &&
|
|
||||||
"Attempted to manifest an attribute without associated value!");
|
"Attempted to manifest an attribute without associated value!");
|
||||||
|
|
||||||
ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
|
ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
|
||||||
|
|
||||||
Function &ScopeFn = getAnchorScope();
|
Function &ScopeFn = IRP.getAnchorScope();
|
||||||
LLVMContext &Ctx = ScopeFn.getContext();
|
LLVMContext &Ctx = ScopeFn.getContext();
|
||||||
IRPosition::Kind PK = getPositionKind();
|
IRPosition::Kind PK = IRP.getPositionKind();
|
||||||
|
|
||||||
SmallVector<Attribute, 4> DeducedAttrs;
|
|
||||||
getDeducedAttributes(Ctx, DeducedAttrs);
|
|
||||||
|
|
||||||
// In the following some generic code that will manifest attributes in
|
// In the following some generic code that will manifest attributes in
|
||||||
// DeducedAttrs if they improve the current IR. Due to the different
|
// 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();
|
Attrs = ScopeFn.getAttributes();
|
||||||
break;
|
break;
|
||||||
case IRPosition::IRP_CALL_SITE_ARGUMENT:
|
case IRPosition::IRP_CALL_SITE_ARGUMENT:
|
||||||
Attrs = ImmutableCallSite(&getAnchorValue()).getAttributes();
|
Attrs = ImmutableCallSite(&IRP.getAnchorValue()).getAttributes();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const Attribute &Attr : DeducedAttrs) {
|
for (const Attribute &Attr : DeducedAttrs) {
|
||||||
if (!addIfNotExistent(Ctx, Attr, Attrs, getAttrIdx()))
|
if (!addIfNotExistent(Ctx, Attr, Attrs, IRP.getAttrIdx()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
HasChanged = ChangeStatus::CHANGED;
|
HasChanged = ChangeStatus::CHANGED;
|
||||||
|
@ -382,7 +377,7 @@ ChangeStatus IRAttribute<AK, Base>::manifest(Attributor &A) {
|
||||||
ScopeFn.setAttributes(Attrs);
|
ScopeFn.setAttributes(Attrs);
|
||||||
break;
|
break;
|
||||||
case IRPosition::IRP_CALL_SITE_ARGUMENT:
|
case IRPosition::IRP_CALL_SITE_ARGUMENT:
|
||||||
CallSite(&getAnchorValue()).setAttributes(Attrs);
|
CallSite(&IRP.getAnchorValue()).setAttributes(Attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return HasChanged;
|
return HasChanged;
|
||||||
|
|
Loading…
Reference in New Issue