diff --git a/mlir/include/mlir/TableGen/Pattern.h b/mlir/include/mlir/TableGen/Pattern.h index 49b2dae62dc22..d2610f09b6241 100644 --- a/mlir/include/mlir/TableGen/Pattern.h +++ b/mlir/include/mlir/TableGen/Pattern.h @@ -643,8 +643,10 @@ class Pattern { using IdentifierLine = std::pair; // Returns the file location of the pattern (buffer identifier + line number - // pair). - std::vector getLocation() const; + // pair). If `forSourceOutput` is true, replace absolute paths in the buffer + // identifier with just their filename so that we don't leak build paths into + // the generated code. + std::vector getLocation(bool forSourceOutput = false) const; // Recursively collects all bound symbols inside the DAG tree rooted // at `tree` and updates the given `infoMap`. diff --git a/mlir/lib/TableGen/Pattern.cpp b/mlir/lib/TableGen/Pattern.cpp index 1a1a58ad271bb..ce09f5c3f5183 100644 --- a/mlir/lib/TableGen/Pattern.cpp +++ b/mlir/lib/TableGen/Pattern.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/Twine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/Path.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" @@ -771,15 +772,27 @@ int Pattern::getBenefit() const { return initBenefit + dyn_cast(delta->getArg(0))->getValue(); } -std::vector Pattern::getLocation() const { +std::vector +Pattern::getLocation(bool forSourceOutput) const { std::vector> result; result.reserve(def.getLoc().size()); for (auto loc : def.getLoc()) { unsigned buf = llvm::SrcMgr.FindBufferContainingLoc(loc); assert(buf && "invalid source location"); - result.emplace_back( - llvm::SrcMgr.getBufferInfo(buf).Buffer->getBufferIdentifier(), - llvm::SrcMgr.getLineAndColumn(loc, buf).first); + + StringRef bufferName = + llvm::SrcMgr.getBufferInfo(buf).Buffer->getBufferIdentifier(); + // If we're emitting a generated file, we'd like to have some indication of + // where our patterns came from. However, LLVM's build rules use absolute + // paths as arguments to TableGen, and naively echoing such paths makes the + // contents of the generated source file depend on the build location, + // making MLIR builds substantially less reproducable. As a compromise, we + // trim absolute paths back to only the filename component. + if (forSourceOutput && llvm::sys::path::is_absolute(bufferName)) + bufferName = llvm::sys::path::filename(bufferName); + + result.emplace_back(bufferName, + llvm::SrcMgr.getLineAndColumn(loc, buf).first); } return result; } diff --git a/mlir/tools/mlir-tblgen/RewriterGen.cpp b/mlir/tools/mlir-tblgen/RewriterGen.cpp index c3034bb843c4a..08d6483e1f1b3 100644 --- a/mlir/tools/mlir-tblgen/RewriterGen.cpp +++ b/mlir/tools/mlir-tblgen/RewriterGen.cpp @@ -1129,7 +1129,7 @@ void PatternEmitter::emit(StringRef rewriteName) { LLVM_DEBUG(llvm::dbgs() << "done collecting ops used in result patterns\n"); // Emit RewritePattern for Pattern. - auto locs = pattern.getLocation(); + auto locs = pattern.getLocation(/*forSourceOutput=*/true); os << formatv("/* Generated from:\n {0:$[ instantiating\n ]}\n*/\n", llvm::reverse(locs)); os << formatv(R"(struct {0} : public ::mlir::RewritePattern {