18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/ADT/TypeSwitch.h"
20 #include "llvm/BinaryFormat/Dwarf.h"
21 #include "llvm/IR/DebugInfoMetadata.h"
31 SmallVector<uint64_t> &args);
36 ArrayRef<uint64_t> args);
38 #include "mlir/Dialect/LLVMIR/LLVMAttrInterfaces.cpp.inc"
39 #include "mlir/Dialect/LLVMIR/LLVMOpsEnums.cpp.inc"
40 #define GET_ATTRDEF_CLASSES
41 #include "mlir/Dialect/LLVMIR/LLVMOpsAttrDefs.cpp.inc"
47 void LLVMDialect::registerAttributes() {
49 #define GET_ATTRDEF_LIST
50 #include "mlir/Dialect/LLVMIR/LLVMOpsAttrDefs.cpp.inc"
59 return llvm::isa<DIBasicTypeAttr, DICompileUnitAttr, DICompositeTypeAttr,
60 DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
61 DILabelAttr, DILexicalBlockAttr, DILexicalBlockFileAttr,
62 DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
63 DINullTypeAttr, DISubprogramAttr, DISubrangeAttr,
64 DISubroutineTypeAttr>(attr);
72 return llvm::isa<DICompileUnitAttr, DICompositeTypeAttr, DIFileAttr,
81 return llvm::isa<DILexicalBlockAttr, DILexicalBlockFileAttr,
82 DISubprogramAttr>(attr);
90 return llvm::isa<DINullTypeAttr, DIBasicTypeAttr, DICompositeTypeAttr,
91 DIDerivedTypeAttr, DISubroutineTypeAttr>(attr);
99 return llvm::isa<TBAATypeDescriptorAttr, TBAARootAttr>(attr);
108 if (memInfoArgs.empty())
110 ModRefInfo::ModRef, ModRefInfo::ModRef);
111 if (memInfoArgs.size() == 3)
117 bool MemoryEffectsAttr::isReadWrite() {
118 if (this->getArgMem() != ModRefInfo::ModRef)
120 if (this->getInaccessibleMem() != ModRefInfo::ModRef)
122 if (this->getOther() != ModRefInfo::ModRef)
132 return get(context, ArrayRef<DIExpressionElemAttr>({}));
136 SmallVector<uint64_t> &args) {
138 uint64_t operand = 0;
139 if (!args.empty() && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
143 operand = llvm::dwarf::getAttributeEncoding(keyword);
147 <<
"encountered unknown attribute encoding \"" << keyword
159 <<
"expected integer operand";
163 args.push_back(operand);
172 ArrayRef<uint64_t> args) {
174 llvm::interleaveComma(args, printer, [&](uint64_t operand) {
175 if (i > 0 && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
176 if (
const StringRef keyword =
177 llvm::dwarf::AttributeEncodingString(operand);
193 DIRecursiveTypeAttrInterface
196 getFile(), getLine(), getScope(),
197 getBaseType(), getFlags(), getSizeInBits(),
198 getAlignInBits(), getElements());
201 DIRecursiveTypeAttrInterface
204 {}, DIFlags(), 0, 0, {});
214 llvm::map_to_vector(features, [&](StringRef feature) {
220 StringRef targetFeatures) {
221 SmallVector<StringRef> features;
222 targetFeatures.split(features,
',', -1,
224 return get(context, features);
230 for (StringAttr featureAttr : features) {
231 if (!featureAttr || featureAttr.empty())
232 return emitError() <<
"target features can not be null or empty";
233 auto feature = featureAttr.strref();
234 if (feature[0] !=
'+' && feature[0] !=
'-')
235 return emitError() <<
"target features must start with '+' or '-'";
236 if (feature.contains(
','))
237 return emitError() <<
"target features can not contain ','";
246 return llvm::is_contained(getFeatures(), feature);
252 return llvm::is_contained(getFeatures(), feature);
255 std::string TargetFeaturesAttr::getFeaturesString()
const {
256 std::string featuresString;
257 llvm::raw_string_ostream ss(featuresString);
259 getFeatures(), ss, [&](
auto &feature) { ss << feature.strref(); },
",");
263 TargetFeaturesAttr TargetFeaturesAttr::featuresAt(
Operation *op) {
267 return parentFunction.getOperation()->getAttrOfType<TargetFeaturesAttr>(
static MLIRContext * getContext(OpFoldResult val)
static LogicalResult parseExpressionArg(AsmParser &parser, uint64_t opcode, SmallVector< uint64_t > &args)
Parses DWARF expression arguments with respect to the DWARF operation opcode.
static void printExpressionArg(AsmPrinter &printer, uint64_t opcode, ArrayRef< uint64_t > args)
Prints DWARF expression arguments with respect to the specific DWARF operation.
static bool contains(SMRange range, SMLoc loc)
Returns true if the given range contains the given source location.
This base class exposes generic asm parser hooks, usable across the various derived parsers.
virtual ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())=0
Parse a list of comma-separated items with an optional delimiter.
virtual ParseResult parseOptionalKeyword(StringRef keyword)=0
Parse the given keyword if present.
virtual InFlightDiagnostic emitError(SMLoc loc, const Twine &message={})=0
Emit a diagnostic at the specified location and return failure.
ParseResult parseInteger(IntT &result)
Parse an integer value from the stream.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
This base class exposes generic asm printer hooks, usable across the various derived printers.
Attributes are known-constant values of operations.
MLIRContext * getContext() const
Return the context this attribute belongs to.
An attribute that associates a referenced attribute with a unique identifier.
This class represents a diagnostic that is inflight and set to be reported.
This class represents a LLVM attribute that describes a local debug info scope.
static bool classof(Attribute attr)
Support LLVM type casting.
static bool classof(Attribute attr)
static bool classof(Attribute attr)
Support LLVM type casting.
static bool classof(Attribute attr)
Support LLVM type casting.
static bool classof(Attribute attr)
Support LLVM type casting.
MLIRContext is the top-level object for a collection of MLIR operations.
Operation is the basic unit of execution within MLIR.
OpTy getParentOfType()
Return the closest surrounding parent operation that is of type 'OpTy'.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
bool succeeded(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a success value.
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
This class represents an efficient way to signal success or failure.