Skip to content
Open
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
23 changes: 19 additions & 4 deletions llvm/include/llvm/Support/SourceMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#ifndef LLVM_SUPPORT_SOURCEMGR_H
#define LLVM_SUPPORT_SOURCEMGR_H

#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/MemoryBuffer.h"
Expand All @@ -23,6 +24,10 @@

namespace llvm {

namespace vfs {
class FileSystem;
} // end namespace vfs

class raw_ostream;
class SMDiagnostic;
class SMFixIt;
Expand Down Expand Up @@ -91,15 +96,25 @@ class SourceMgr {
DiagHandlerTy DiagHandler = nullptr;
void *DiagContext = nullptr;

// Optional file system for finding include files.
IntrusiveRefCntPtr<vfs::FileSystem> FS;

bool isValidBufferID(unsigned i) const { return i && i <= Buffers.size(); }

public:
SourceMgr() = default;
/// Create new source manager without support for include files.
SourceMgr();
/// Create new source manager with the capability of finding include files
/// via the provided file system.
explicit SourceMgr(IntrusiveRefCntPtr<vfs::FileSystem> FS);
SourceMgr(const SourceMgr &) = delete;
SourceMgr &operator=(const SourceMgr &) = delete;
SourceMgr(SourceMgr &&) = default;
SourceMgr &operator=(SourceMgr &&) = default;
~SourceMgr() = default;
SourceMgr(SourceMgr &&);
SourceMgr &operator=(SourceMgr &&);
~SourceMgr();

IntrusiveRefCntPtr<vfs::FileSystem> getVirtualFileSystem() const;
void setVirtualFileSystem(IntrusiveRefCntPtr<vfs::FileSystem> FS);

/// Return the include directories of this source manager.
ArrayRef<std::string> getIncludeDirs() const { return IncludeDirectories; }
Expand Down
24 changes: 22 additions & 2 deletions llvm/lib/Support/SourceMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
Expand All @@ -38,6 +39,22 @@ using namespace llvm;

static const size_t TabStop = 8;

// Out of line to avoid needing definition of vfs::FileSystem in header.
SourceMgr::SourceMgr() = default;
SourceMgr::SourceMgr(IntrusiveRefCntPtr<vfs::FileSystem> FS)
: FS(std::move(FS)) {}
SourceMgr::SourceMgr(SourceMgr &&) = default;
SourceMgr &SourceMgr::operator=(SourceMgr &&) = default;
SourceMgr::~SourceMgr() = default;

IntrusiveRefCntPtr<vfs::FileSystem> SourceMgr::getVirtualFileSystem() const {
return FS;
}

void SourceMgr::setVirtualFileSystem(IntrusiveRefCntPtr<vfs::FileSystem> FS) {
this->FS = std::move(FS);
}

unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
SMLoc IncludeLoc,
std::string &IncludedFile) {
Expand All @@ -52,16 +69,19 @@ unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
ErrorOr<std::unique_ptr<MemoryBuffer>>
SourceMgr::OpenIncludeFile(const std::string &Filename,
std::string &IncludedFile) {
if (!FS)
reportFatalInternalError("Opening include file from SourceMgr without VFS");

ErrorOr<std::unique_ptr<MemoryBuffer>> NewBufOrErr =
MemoryBuffer::getFile(Filename);
FS->getBufferForFile(Filename);

SmallString<64> Buffer(Filename);
// If the file didn't exist directly, see if it's in an include path.
for (unsigned i = 0, e = IncludeDirectories.size(); i != e && !NewBufOrErr;
++i) {
Buffer = IncludeDirectories[i];
sys::path::append(Buffer, Filename);
NewBufOrErr = MemoryBuffer::getFile(Buffer);
NewBufOrErr = FS->getBufferForFile(Buffer);
}

if (NewBufOrErr)
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/TableGen/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
Expand Down Expand Up @@ -129,6 +130,8 @@ int llvm::TableGenMain(const char *argv0,
// it later.
SrcMgr.setIncludeDirs(IncludeDirs);

SrcMgr.setVirtualFileSystem(vfs::getRealFileSystem());

TGParser Parser(SrcMgr, MacroNames, Records, NoWarnOnUnusedTemplateArgs);

if (Parser.ParseFile())
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/TableGen/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "llvm/TableGen/Parser.h"
#include "TGParser.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/TableGen/Record.h"

using namespace llvm;
Expand All @@ -20,6 +21,7 @@ bool llvm::TableGenParseFile(SourceMgr &InputSrcMgr, RecordKeeper &Records) {
// this reliance, we could drop all of this.
SrcMgr = SourceMgr();
SrcMgr.takeSourceBuffersFrom(InputSrcMgr);
SrcMgr.setVirtualFileSystem(InputSrcMgr.getVirtualFileSystem());
SrcMgr.setIncludeDirs(InputSrcMgr.getIncludeDirs());
SrcMgr.setDiagHandler(InputSrcMgr.getDiagHandler(),
InputSrcMgr.getDiagContext());
Expand Down
2 changes: 2 additions & 0 deletions mlir/tools/mlir-pdll/mlir-pdll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/VirtualFileSystem.h"
#include <set>

using namespace mlir;
Expand All @@ -40,6 +41,7 @@ processBuffer(raw_ostream &os, std::unique_ptr<llvm::MemoryBuffer> chunkBuffer,
OutputType outputType, std::vector<std::string> &includeDirs,
bool dumpODS, std::set<std::string> *includedFiles) {
llvm::SourceMgr sourceMgr;
sourceMgr.setFileSystem(llvm::vfs::getRealFileSystem());
sourceMgr.setIncludeDirs(includeDirs);
sourceMgr.AddNewSourceBuffer(std::move(chunkBuffer), SMLoc());

Expand Down
Loading