Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/ExampleDialect.td
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ def Add32Op : ExampleOp<"add32", [Memory<[]>, NoUnwind, WillReturn]> {
}];
}

def SizeOfOp : ExampleOp<"sizeof", [Memory<[]>, NoUnwind, WillReturn]> {
def SizeOfOp : ExampleOp<"sizeof", [Memory<[]>, NoUnwind, WillReturn, NoCapture<ArgIndex<0>>]> {
let results = (outs I64:$result);
let arguments = (ins type:$sizeof_type);

Expand Down
12 changes: 12 additions & 0 deletions include/llvm-dialects/Dialect/Dialect.td
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,10 @@ class LlvmEnumAttributeTrait<string llvmEnum_> : Trait {
string llvmEnum = llvmEnum_;
}

class LlvmEnumArgAttributeTrait<string llvmEnum_> : LlvmEnumAttributeTrait<llvmEnum_> {
int idx;
}

def NoUnwind : LlvmEnumAttributeTrait<"NoUnwind">;
def WillReturn : LlvmEnumAttributeTrait<"WillReturn">;
def NoReturn : LlvmEnumAttributeTrait<"NoReturn">;
Expand All @@ -346,6 +350,14 @@ def Hot : LlvmEnumAttributeTrait<"Hot">;
def Convergent : LlvmEnumAttributeTrait<"Convergent">;
def Speculatable : LlvmEnumAttributeTrait<"Speculatable">;

class ArgIndex<int argNo_> {
int argNo = argNo_;
}

class NoCapture <ArgIndex argIdx> : LlvmEnumArgAttributeTrait<"NoCapture"> {
let idx = argIdx.argNo;
}

/// Represent the LLVM `memory(...)` attribute as the OR (or union) of memory
/// effects. An empty effects list means the operation does not access memory
/// at all. If this trait is missing, it means that there is no bound on the
Expand Down
1 change: 1 addition & 0 deletions include/llvm-dialects/TableGen/Traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class Trait {
enum class Kind : uint8_t {
LlvmAttributeTrait_First,
LlvmEnumAttributeTrait = LlvmAttributeTrait_First,
LlvmEnumArgAttributeTrait,
LlvmMemoryAttributeTrait,
LlvmAttributeTrait_Last = LlvmMemoryAttributeTrait,
};
Expand Down
7 changes: 5 additions & 2 deletions lib/TableGen/GenDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,13 @@ void llvm_dialects::genDialectDefs(raw_ostream &out, RecordKeeperTy &records) {
if (!dialect->attribute_lists_empty()) {
FmtContextScope scope{fmt};
fmt.addSubst("attrBuilder", "attrBuilder");
fmt.addSubst("argAttrList", "argAttrList");

for (const auto &enumeratedTraits : enumerate(dialect->attribute_lists())) {
out << tgfmt("{\n ::llvm::AttrBuilder $attrBuilder{context};\n", &fmt);
out << tgfmt(" ::llvm::AttributeList $argAttrList;\n", &fmt);

SmallVector<const LlvmAttributeTrait *> argTraits;
for (const Trait *trait : enumeratedTraits.value()) {
if (auto *llvmAttribute = dyn_cast<LlvmAttributeTrait>(trait)) {
llvmAttribute->addAttribute(out, fmt);
Expand All @@ -355,8 +358,8 @@ void llvm_dialects::genDialectDefs(raw_ostream &out, RecordKeeperTy &records) {
}
}

out << tgfmt("m_attributeLists[$0] = ::llvm::AttributeList::get(context, "
"::llvm::AttributeList::FunctionIndex, $attrBuilder);\n}\n",
out << tgfmt("m_attributeLists[$0] = "
"$argAttrList.addFnAttributes(context, $attrBuilder);\n}\n",
&fmt, enumeratedTraits.index());
}
}
Expand Down
38 changes: 35 additions & 3 deletions lib/TableGen/Traits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ static cl::opt<bool> NoMemoryEffects(

class LlvmEnumAttributeTrait : public LlvmAttributeTrait {
public:
LlvmEnumAttributeTrait() : LlvmAttributeTrait(Kind::LlvmEnumAttributeTrait) {}
LlvmEnumAttributeTrait(Kind kind) : LlvmAttributeTrait(kind) {}

void init(GenDialectsContext *context, RecordTy *record) override;

Expand All @@ -52,6 +52,24 @@ class LlvmEnumAttributeTrait : public LlvmAttributeTrait {
std::string m_llvmEnum;
};

class LlvmEnumArgAttributeTrait : public LlvmEnumAttributeTrait {
public:
LlvmEnumArgAttributeTrait() : LlvmEnumAttributeTrait(Kind::LlvmEnumArgAttributeTrait) {}

void init(GenDialectsContext *context, RecordTy *record) override;

void addAttribute(llvm::raw_ostream &out, FmtContext &fmt) const override;

int getIdx() const { return m_idx; }

static bool classof(const Trait *t) {
return t->getKind() == Kind::LlvmEnumArgAttributeTrait;
}

private:
int m_idx;
};

class LlvmMemoryAttributeTrait : public LlvmAttributeTrait {
public:
LlvmMemoryAttributeTrait()
Expand Down Expand Up @@ -85,8 +103,10 @@ bool llvm_dialects::noMemoryEffects() {
std::unique_ptr<Trait> Trait::fromRecord(GenDialectsContext *context,
RecordTy *traitRec) {
std::unique_ptr<Trait> result;
if (traitRec->isSubClassOf("LlvmEnumAttributeTrait")) {
result = std::make_unique<LlvmEnumAttributeTrait>();
if (traitRec->isSubClassOf("LlvmEnumArgAttributeTrait")) {
result = std::make_unique<LlvmEnumArgAttributeTrait>();
} else if (traitRec->isSubClassOf("LlvmEnumAttributeTrait")) {
result = std::make_unique<LlvmEnumAttributeTrait>(Kind::LlvmEnumAttributeTrait);
} else if (traitRec->isSubClassOf("Memory")) {
result = std::make_unique<LlvmMemoryAttributeTrait>();
} else {
Expand All @@ -108,12 +128,24 @@ void LlvmEnumAttributeTrait::init(GenDialectsContext *context,
m_llvmEnum = record->getValueAsString("llvmEnum");
}

void LlvmEnumArgAttributeTrait::init(GenDialectsContext *context,
RecordTy *record) {
LlvmEnumAttributeTrait::init(context, record);
m_idx = record->getValueAsInt("idx");
}

void LlvmEnumAttributeTrait::addAttribute(raw_ostream &out,
FmtContext &fmt) const {
out << tgfmt("$attrBuilder.addAttribute(::llvm::Attribute::$0);\n", &fmt,
getLlvmEnum());
}

void LlvmEnumArgAttributeTrait::addAttribute(raw_ostream &out,
FmtContext &fmt) const {
out << tgfmt("$argAttrList = $argAttrList.addParamAttribute(context, $0, ::llvm::Attribute::$1);\n",
&fmt, getIdx(), getLlvmEnum());
}

void LlvmMemoryAttributeTrait::init(GenDialectsContext *context,
RecordTy *record) {
LlvmAttributeTrait::init(context, record);
Expand Down
56 changes: 35 additions & 21 deletions test/example/generated/ExampleDialect.cpp.inc
Original file line number Diff line number Diff line change
Expand Up @@ -185,35 +185,49 @@ namespace xd::cpp {
ExampleDialect::ExampleDialect(::llvm::LLVMContext& context) : DialectImpl(context) {
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::NoUnwind);
attrBuilder.addAttribute(::llvm::Attribute::WillReturn);
attrBuilder.addMemoryAttr(::llvm::MemoryEffects::none());
m_attributeLists[0] = ::llvm::AttributeList::get(context, ::llvm::AttributeList::FunctionIndex, attrBuilder);
m_attributeLists[0] = argAttrList.addFnAttributes(context, attrBuilder);
}
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::NoUnwind);
attrBuilder.addAttribute(::llvm::Attribute::WillReturn);
attrBuilder.addMemoryAttr(::llvm::MemoryEffects::none());
argAttrList = argAttrList.addParamAttribute(context, 0, ::llvm::Attribute::NoCapture);
m_attributeLists[1] = argAttrList.addFnAttributes(context, attrBuilder);
}
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::NoUnwind);
attrBuilder.addAttribute(::llvm::Attribute::WillReturn);
attrBuilder.addMemoryAttr(::llvm::MemoryEffects(::llvm::ModRefInfo::Ref));
m_attributeLists[1] = ::llvm::AttributeList::get(context, ::llvm::AttributeList::FunctionIndex, attrBuilder);
m_attributeLists[2] = argAttrList.addFnAttributes(context, attrBuilder);
}
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::NoUnwind);
attrBuilder.addAttribute(::llvm::Attribute::WillReturn);
attrBuilder.addMemoryAttr(::llvm::MemoryEffects(::llvm::MemoryEffects::Location::InaccessibleMem, ::llvm::ModRefInfo::Mod));
m_attributeLists[2] = ::llvm::AttributeList::get(context, ::llvm::AttributeList::FunctionIndex, attrBuilder);
m_attributeLists[3] = argAttrList.addFnAttributes(context, attrBuilder);
}
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::NoUnwind);
attrBuilder.addMemoryAttr(::llvm::MemoryEffects(::llvm::MemoryEffects::Location::InaccessibleMem, ::llvm::ModRefInfo::ModRef));
m_attributeLists[3] = ::llvm::AttributeList::get(context, ::llvm::AttributeList::FunctionIndex, attrBuilder);
m_attributeLists[4] = argAttrList.addFnAttributes(context, attrBuilder);
}
{
::llvm::AttrBuilder attrBuilder{context};
::llvm::AttributeList argAttrList;
attrBuilder.addAttribute(::llvm::Attribute::WillReturn);
m_attributeLists[4] = ::llvm::AttributeList::get(context, ::llvm::AttributeList::FunctionIndex, attrBuilder);
m_attributeLists[5] = argAttrList.addFnAttributes(context, attrBuilder);
}
}

Expand Down Expand Up @@ -1111,7 +1125,7 @@ source


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), {
::llvm::IntegerType::get(context, 1),
}, false);
Expand Down Expand Up @@ -1302,7 +1316,7 @@ index


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::IntegerType::get(context, 32), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -1386,7 +1400,7 @@ instName_0


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::IntegerType::get(context, 32), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -1460,7 +1474,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::IntegerType::get(context, 32), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -1538,7 +1552,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), {
}, false);

Expand Down Expand Up @@ -1589,7 +1603,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), {
}, false);

Expand Down Expand Up @@ -1640,7 +1654,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(3);
= ExampleDialect::get(context).getAttributeList(4);

std::string mangledName =
::llvm_dialects::getMangledName(s_name, {dataType});
Expand Down Expand Up @@ -1697,7 +1711,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(3);
= ExampleDialect::get(context).getAttributeList(4);

std::string mangledName =
::llvm_dialects::getMangledName(s_name, {dataType});
Expand Down Expand Up @@ -1754,7 +1768,7 @@ instName


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(2);
= ExampleDialect::get(context).getAttributeList(3);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -1817,7 +1831,7 @@ data


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(0);
= ExampleDialect::get(context).getAttributeList(1);
auto fnType = ::llvm::FunctionType::get(::llvm::IntegerType::get(context, 64), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -1891,7 +1905,7 @@ data


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(1);
= ExampleDialect::get(context).getAttributeList(2);

std::string mangledName =
::llvm_dialects::getMangledName(s_name, {initial->getType()});
Expand Down Expand Up @@ -1983,7 +1997,7 @@ initial


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(1);
= ExampleDialect::get(context).getAttributeList(2);

std::string mangledName =
::llvm_dialects::getMangledName(s_name, {initial->getType()});
Expand Down Expand Up @@ -2075,7 +2089,7 @@ initial


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(1);
= ExampleDialect::get(context).getAttributeList(2);

std::string mangledName =
::llvm_dialects::getMangledName(s_name, {initial->getType()});
Expand Down Expand Up @@ -2167,7 +2181,7 @@ initial


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(4);
= ExampleDialect::get(context).getAttributeList(5);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), {
::llvm::PointerType::get(::llvm::Type::getInt8Ty(context), 0),
}, false);
Expand Down Expand Up @@ -2236,7 +2250,7 @@ initial


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(2);
= ExampleDialect::get(context).getAttributeList(3);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down Expand Up @@ -2299,7 +2313,7 @@ data


const ::llvm::AttributeList attrs
= ExampleDialect::get(context).getAttributeList(2);
= ExampleDialect::get(context).getAttributeList(3);
auto fnType = ::llvm::FunctionType::get(::llvm::Type::getVoidTy(context), true);

auto fn = module.getOrInsertFunction(s_name, fnType, attrs);
Expand Down
2 changes: 1 addition & 1 deletion test/example/generated/ExampleDialect.h.inc
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ namespace xd::cpp {
}

private:
::std::array<::llvm::AttributeList, 5> m_attributeLists;
::std::array<::llvm::AttributeList, 6> m_attributeLists;
};

class XdHandleType : public ::llvm::TargetExtType {
Expand Down
Loading