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, DIStringTypeAttr, DISubprogramAttr,
64 DISubrangeAttr, DISubroutineTypeAttr>(attr);
72 return llvm::isa<DICompileUnitAttr, DICompositeTypeAttr, DIFileAttr,
81 return llvm::isa<DILexicalBlockAttr, DILexicalBlockFileAttr,
82 DISubprogramAttr>(attr);
90 return llvm::isa<DILocalVariableAttr, DIGlobalVariableAttr>(attr);
98 return llvm::isa<DINullTypeAttr, DIBasicTypeAttr, DICompositeTypeAttr,
99 DIDerivedTypeAttr, DIStringTypeAttr, DISubroutineTypeAttr>(
108 return llvm::isa<TBAATypeDescriptorAttr, TBAARootAttr>(attr);
117 if (memInfoArgs.empty())
119 ModRefInfo::ModRef, ModRefInfo::ModRef);
120 if (memInfoArgs.size() == 3)
126 bool MemoryEffectsAttr::isReadWrite() {
127 if (this->getArgMem() != ModRefInfo::ModRef)
129 if (this->getInaccessibleMem() != ModRefInfo::ModRef)
131 if (this->getOther() != ModRefInfo::ModRef)
141 return get(context, ArrayRef<DIExpressionElemAttr>({}));
145 SmallVector<uint64_t> &args) {
146 auto operandParser = [&]() -> LogicalResult {
147 uint64_t operand = 0;
148 if (!args.empty() && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
152 operand = llvm::dwarf::getAttributeEncoding(keyword);
156 <<
"encountered unknown attribute encoding \"" << keyword
168 <<
"expected integer operand";
172 args.push_back(operand);
181 ArrayRef<uint64_t> args) {
183 llvm::interleaveComma(args, printer, [&](uint64_t operand) {
184 if (i > 0 && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
185 if (
const StringRef keyword =
186 llvm::dwarf::AttributeEncodingString(operand);
202 DIRecursiveTypeAttrInterface
205 getContext(), getTag(), recId, getName(), getFile(), getLine(),
206 getScope(), getBaseType(), getFlags(), getSizeInBits(), getAlignInBits(),
207 getElements(), getDataLocation(), getRank(), getAllocated(),
211 DIRecursiveTypeAttrInterface
214 {}, DIFlags(), 0, 0, {}, {}, {}, {}, {});
224 llvm::map_to_vector(features, [&](StringRef feature) {
230 StringRef targetFeatures) {
231 SmallVector<StringRef> features;
232 targetFeatures.split(features,
',', -1,
234 return get(context, features);
240 for (StringAttr featureAttr : features) {
241 if (!featureAttr || featureAttr.empty())
242 return emitError() <<
"target features can not be null or empty";
243 auto feature = featureAttr.strref();
244 if (feature[0] !=
'+' && feature[0] !=
'-')
245 return emitError() <<
"target features must start with '+' or '-'";
246 if (feature.contains(
','))
247 return emitError() <<
"target features can not contain ','";
256 return llvm::is_contained(getFeatures(), feature);
262 return llvm::is_contained(getFeatures(), feature);
265 std::string TargetFeaturesAttr::getFeaturesString()
const {
266 std::string featuresString;
267 llvm::raw_string_ostream ss(featuresString);
269 getFeatures(), ss, [&](
auto &feature) { ss << feature.strref(); },
",");
273 TargetFeaturesAttr TargetFeaturesAttr::featuresAt(
Operation *op) {
277 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.
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.
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,...