Skip to content

Commit

Permalink
[mlir][docgen] Add ops source link (#73657)
Browse files Browse the repository at this point in the history
This patch suggests to change two things. Firstly, it adds a source link
above the generated operations docs (above the `emitOpDoc` calls). This
link will point directly to the source TableGen file for the group of
operations. For example, for the current
[`amdgpu`](https://mlir.llvm.org/docs/Dialects/AMDGPU/) page, the link
will add a source link below the "Operation definition" heading pointing
to
[`mlir/include/mlir/Dialect/AMDGPU/IR/AMDGPU.td`](https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/Dialect/AMDGPU/IR/AMDGPU.td).
The link is wrapped in a "op-definitions-source-link" class which could
allow for custom styling, but it also looks reasonable without custom
styling I think:

![afbeelding](https://github.com/llvm/llvm-project/assets/20724914/7c0e59b9-b14b-4f5d-a671-c87e857a7b03)

Secondly, this patch simplifies the header names such as "Operation
definition" and "Attribute definition" to "Operations" and "Attributes"
respectively. This is in line with manually defined subheadings on pages
such as the one for the
[`vector`](https://mlir.llvm.org/docs/Dialects/Vector/#operations)
dialect.
  • Loading branch information
rikhuijzer committed Nov 30, 2023
1 parent b724561 commit e9869b5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 12 deletions.
4 changes: 2 additions & 2 deletions mlir/test/mlir-tblgen/gen-dialect-doc.td
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def TestTypeDefParams : TypeDef<Test_Dialect, "TestTypeDefParams"> {
// CHECK: Interfaces: NoMemoryEffect (MemoryEffectOpInterface)
// CHECK: Effects: MemoryEffects::Effect{}

// CHECK: ## Attribute constraint definition
// CHECK: ## Attribute constraints
// CHECK: ### attribute summary
// CHECK: attribute description

Expand All @@ -97,7 +97,7 @@ def TestTypeDefParams : TypeDef<Test_Dialect, "TestTypeDefParams"> {
// CHECK: Syntax:
// CHECK: #test.test_attr_def_params

// CHECK: ## Type constraint definition
// CHECK: ## Type constraints
// CHECK: ### type summary
// CHECK: type description

Expand Down
34 changes: 24 additions & 10 deletions mlir/tools/mlir-tblgen/OpDocGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,22 @@ static void emitOpDoc(const Operator &op, raw_ostream &os) {
os << "\n";
}

static void emitSourceLink(StringRef inputFilename, raw_ostream &os) {
size_t pathBegin = inputFilename.find("mlir/include/mlir/");
if (pathBegin == StringRef::npos)
return;

StringRef inputFromMlirInclude = inputFilename.substr(pathBegin);

os << "[source](https://github.com/llvm/llvm-project/blob/main/"
<< inputFromMlirInclude << ")\n\n";
}

static void emitOpDoc(const RecordKeeper &recordKeeper, raw_ostream &os) {
auto opDefs = getRequestedOpDefinitions(recordKeeper);

os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
emitSourceLink(recordKeeper.getInputFilename(), os);
for (const llvm::Record *opDef : opDefs)
emitOpDoc(Operator(opDef), os);
}
Expand Down Expand Up @@ -392,12 +404,13 @@ static void maybeNest(bool nest, llvm::function_ref<void(raw_ostream &os)> fn,
}
}

static void emitBlock(ArrayRef<Attribute> attributes,
static void emitBlock(ArrayRef<Attribute> attributes, StringRef inputFilename,
ArrayRef<AttrDef> attrDefs, ArrayRef<OpDocGroup> ops,
ArrayRef<Type> types, ArrayRef<TypeDef> typeDefs,
raw_ostream &os) {
if (!ops.empty()) {
os << "## Operation definition\n\n";
os << "## Operations\n\n";
emitSourceLink(inputFilename, os);
for (const OpDocGroup &grouping : ops) {
bool nested = !grouping.summary.empty();
maybeNest(
Expand All @@ -417,32 +430,32 @@ static void emitBlock(ArrayRef<Attribute> attributes,
}

if (!attributes.empty()) {
os << "## Attribute constraint definition\n\n";
os << "## Attribute constraints\n\n";
for (const Attribute &attr : attributes)
emitAttrDoc(attr, os);
}

if (!attrDefs.empty()) {
os << "## Attribute definition\n\n";
os << "## Attributes\n\n";
for (const AttrDef &def : attrDefs)
emitAttrOrTypeDefDoc(def, os);
}

// TODO: Add link between use and def for types
if (!types.empty()) {
os << "## Type constraint definition\n\n";
os << "## Type constraints\n\n";
for (const Type &type : types)
emitTypeDoc(type, os);
}

if (!typeDefs.empty()) {
os << "## Type definition\n\n";
os << "## Types\n\n";
for (const TypeDef &def : typeDefs)
emitAttrOrTypeDefDoc(def, os);
}
}

static void emitDialectDoc(const Dialect &dialect,
static void emitDialectDoc(const Dialect &dialect, StringRef inputFilename,
ArrayRef<Attribute> attributes,
ArrayRef<AttrDef> attrDefs, ArrayRef<OpDocGroup> ops,
ArrayRef<Type> types, ArrayRef<TypeDef> typeDefs,
Expand All @@ -456,7 +469,7 @@ static void emitDialectDoc(const Dialect &dialect,
if (!r.match(dialect.getDescription()))
os << "[TOC]\n\n";

emitBlock(attributes, attrDefs, ops, types, typeDefs, os);
emitBlock(attributes, inputFilename, attrDefs, ops, types, typeDefs, os);
}

static bool emitDialectDoc(const RecordKeeper &recordKeeper, raw_ostream &os) {
Expand Down Expand Up @@ -536,8 +549,9 @@ static bool emitDialectDoc(const RecordKeeper &recordKeeper, raw_ostream &os) {
});

os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
emitDialectDoc(*dialect, dialectAttrs, dialectAttrDefs, dialectOps,
dialectTypes, dialectTypeDefs, os);
emitDialectDoc(*dialect, recordKeeper.getInputFilename(), dialectAttrs,
dialectAttrDefs, dialectOps, dialectTypes, dialectTypeDefs,
os);
return false;
}

Expand Down

0 comments on commit e9869b5

Please sign in to comment.