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"
61 DIBasicTypeAttr, DICommonBlockAttr, DICompileUnitAttr,
62 DICompositeTypeAttr, DIDerivedTypeAttr, DIFileAttr, DIGenericSubrangeAttr,
63 DIGlobalVariableAttr, DIImportedEntityAttr, DILabelAttr,
64 DILexicalBlockAttr, DILexicalBlockFileAttr, DILocalVariableAttr,
65 DIModuleAttr, DINamespaceAttr, DINullTypeAttr, DIAnnotationAttr,
66 DIStringTypeAttr, DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
75 return llvm::isa<DICommonBlockAttr, DICompileUnitAttr, DICompositeTypeAttr,
85 return llvm::isa<DILexicalBlockAttr, DILexicalBlockFileAttr,
86 DISubprogramAttr>(attr);
94 return llvm::isa<DILocalVariableAttr, DIGlobalVariableAttr>(attr);
102 return llvm::isa<DINullTypeAttr, DIBasicTypeAttr, DICompositeTypeAttr,
103 DIDerivedTypeAttr, DIStringTypeAttr, DISubroutineTypeAttr>(
112 return llvm::isa<TBAATypeDescriptorAttr, TBAARootAttr>(attr);
121 if (memInfoArgs.empty())
123 ModRefInfo::ModRef, ModRefInfo::ModRef);
124 if (memInfoArgs.size() == 3)
130 bool MemoryEffectsAttr::isReadWrite() {
131 if (this->getArgMem() != ModRefInfo::ModRef)
133 if (this->getInaccessibleMem() != ModRefInfo::ModRef)
135 if (this->getOther() != ModRefInfo::ModRef)
145 return get(context, ArrayRef<DIExpressionElemAttr>({}));
149 SmallVector<uint64_t> &args) {
150 auto operandParser = [&]() -> LogicalResult {
151 uint64_t operand = 0;
152 if (!args.empty() && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
156 operand = llvm::dwarf::getAttributeEncoding(keyword);
160 <<
"encountered unknown attribute encoding \"" << keyword
172 <<
"expected integer operand";
176 args.push_back(operand);
185 ArrayRef<uint64_t> args) {
187 llvm::interleaveComma(args, printer, [&](uint64_t operand) {
188 if (i > 0 && opcode == llvm::dwarf::DW_OP_LLVM_convert) {
189 if (
const StringRef keyword =
190 llvm::dwarf::AttributeEncodingString(operand);
206 DIRecursiveTypeAttrInterface
209 getContext(), recId, getIsRecSelf(), getTag(), getName(), getFile(),
210 getLine(), getScope(), getBaseType(), getFlags(), getSizeInBits(),
211 getAlignInBits(), getElements(), getDataLocation(), getRank(),
212 getAllocated(), getAssociated());
215 DIRecursiveTypeAttrInterface
218 0, {}, {}, 0, {}, {}, DIFlags(), 0, 0, {}, {},
226 DIRecursiveTypeAttrInterface DISubprogramAttr::withRecId(
DistinctAttr recId) {
228 getCompileUnit(), getScope(), getName(),
229 getLinkageName(), getFile(), getLine(),
230 getScopeLine(), getSubprogramFlags(),
getType(),
231 getRetainedNodes(), getAnnotations());
234 DIRecursiveTypeAttrInterface DISubprogramAttr::getRecSelf(
DistinctAttr recId) {
236 {}, {}, {}, {}, {}, 0, 0, {}, {}, {}, {}, {});
245 IntegerType widthType;
250 unsigned bitWidth = widthType.getWidth();
251 APInt lower(bitWidth, 0);
252 APInt upper(bitWidth, 0);
258 lower = lower.sextOrTrunc(bitWidth);
260 upper = upper.sextOrTrunc(bitWidth);
266 printer <<
"<i" << getLower().getBitWidth() <<
", " << getLower() <<
", "
267 << getUpper() <<
">";
272 APInt lower, APInt upper) {
273 if (lower.getBitWidth() != upper.getBitWidth())
275 <<
"expected lower and upper to have matching bitwidths but got "
276 << lower.getBitWidth() <<
" vs. " << upper.getBitWidth();
287 llvm::map_to_vector(features, [&](StringRef feature) {
296 return Base::getChecked(
emitError, context,
297 llvm::map_to_vector(features, [&](StringRef feature) {
303 StringRef targetFeatures) {
304 SmallVector<StringRef> features;
305 targetFeatures.split(features,
',', -1,
307 return get(context, features);
313 SmallVector<StringRef> features;
314 targetFeatures.split(features,
',', -1,
316 ArrayRef featuresRef(features);
317 return getChecked(
emitError, context, featuresRef);
323 for (StringAttr featureAttr : features) {
324 if (!featureAttr || featureAttr.empty())
325 return emitError() <<
"target features can not be null or empty";
326 auto feature = featureAttr.strref();
327 if (feature[0] !=
'+' && feature[0] !=
'-')
328 return emitError() <<
"target features must start with '+' or '-'";
329 if (feature.contains(
','))
330 return emitError() <<
"target features can not contain ','";
339 return llvm::is_contained(getFeatures(), feature);
345 return llvm::is_contained(getFeatures(), feature);
348 std::string TargetFeaturesAttr::getFeaturesString()
const {
349 std::string featuresString;
350 llvm::raw_string_ostream ss(featuresString);
352 getFeatures(), ss, [&](
auto &feature) { ss << feature.strref(); },
",");
353 return featuresString;
356 TargetFeaturesAttr TargetFeaturesAttr::featuresAt(
Operation *op) {
360 return parentFunction.getOperation()->getAttrOfType<TargetFeaturesAttr>(
static MLIRContext * getContext(OpFoldResult val)
static void printExpressionArg(AsmPrinter &printer, uint64_t opcode, ArrayRef< uint64_t > args)
Prints DWARF expression arguments with respect to the specific DWARF operation.
static ParseResult parseExpressionArg(AsmParser &parser, uint64_t opcode, SmallVector< uint64_t > &args)
Parses DWARF expression arguments with respect to the DWARF operation opcode.
static bool contains(SMRange range, SMLoc loc)
Returns true if the given range contains the given source location.
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
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.
MLIRContext * getContext() const
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 ParseResult parseLess()=0
Parse a '<' token.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
auto getChecked(SMLoc loc, ParamsT &&...params)
Invoke the getChecked method of the given Attribute or Type class, using the provided location to emi...
virtual ParseResult parseGreater()=0
Parse a '>' token.
virtual ParseResult parseType(Type &result)=0
Parse a type.
virtual ParseResult parseComma()=0
Parse a , token.
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'.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
QueryRef parse(llvm::StringRef line, const QuerySession &qs)
Include the generated interface declarations.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.
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,...