forked from OSchip/llvm-project
Turn FrontendInputFile into an immutable class and have it also accept
a memory buffer instead of only a filename. llvm-svn: 167627
This commit is contained in:
parent
1b3240b0aa
commit
873c8583e0
|
@ -109,7 +109,7 @@ public:
|
|||
/// @{
|
||||
|
||||
bool isCurrentFileAST() const {
|
||||
assert(!CurrentInput.File.empty() && "No current file!");
|
||||
assert(!CurrentInput.isEmpty() && "No current file!");
|
||||
return CurrentASTUnit != 0;
|
||||
}
|
||||
|
||||
|
@ -117,14 +117,14 @@ public:
|
|||
return CurrentInput;
|
||||
}
|
||||
|
||||
const std::string &getCurrentFile() const {
|
||||
assert(!CurrentInput.File.empty() && "No current file!");
|
||||
return CurrentInput.File;
|
||||
const StringRef getCurrentFile() const {
|
||||
assert(!CurrentInput.isEmpty() && "No current file!");
|
||||
return CurrentInput.getFile();
|
||||
}
|
||||
|
||||
InputKind getCurrentFileKind() const {
|
||||
assert(!CurrentInput.File.empty() && "No current file!");
|
||||
return CurrentInput.Kind;
|
||||
assert(!CurrentInput.isEmpty() && "No current file!");
|
||||
return CurrentInput.getKind();
|
||||
}
|
||||
|
||||
ASTUnit &getCurrentASTUnit() const {
|
||||
|
|
|
@ -16,6 +16,10 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
class MemoryBuffer;
|
||||
}
|
||||
|
||||
namespace clang {
|
||||
|
||||
namespace frontend {
|
||||
|
@ -72,19 +76,41 @@ enum InputKind {
|
|||
|
||||
|
||||
/// \brief An input file for the front end.
|
||||
struct FrontendInputFile {
|
||||
class FrontendInputFile {
|
||||
/// \brief The file name, or "-" to read from standard input.
|
||||
std::string File;
|
||||
|
||||
llvm::MemoryBuffer *Buffer;
|
||||
|
||||
/// \brief The kind of input, e.g., C source, AST file, LLVM IR.
|
||||
InputKind Kind;
|
||||
|
||||
/// \brief Whether we're dealing with a 'system' input (vs. a 'user' input).
|
||||
bool IsSystem;
|
||||
|
||||
FrontendInputFile() : Kind(IK_None) { }
|
||||
|
||||
public:
|
||||
FrontendInputFile() : Buffer(0), Kind(IK_None) { }
|
||||
FrontendInputFile(StringRef File, InputKind Kind, bool IsSystem = false)
|
||||
: File(File.str()), Kind(Kind), IsSystem(IsSystem) { }
|
||||
: File(File.str()), Buffer(0), Kind(Kind), IsSystem(IsSystem) { }
|
||||
FrontendInputFile(llvm::MemoryBuffer *buffer, InputKind Kind,
|
||||
bool IsSystem = false)
|
||||
: Buffer(buffer), Kind(Kind), IsSystem(IsSystem) { }
|
||||
|
||||
InputKind getKind() const { return Kind; }
|
||||
bool isSystem() const { return IsSystem; }
|
||||
|
||||
bool isEmpty() const { return File.empty() && Buffer == 0; }
|
||||
bool isFile() const { return !isBuffer(); }
|
||||
bool isBuffer() const { return Buffer != 0; }
|
||||
|
||||
StringRef getFile() const {
|
||||
assert(isFile());
|
||||
return File;
|
||||
}
|
||||
llvm::MemoryBuffer *getBuffer() const {
|
||||
assert(isBuffer());
|
||||
return Buffer;
|
||||
}
|
||||
};
|
||||
|
||||
/// FrontendOptions - Options for controlling the behavior of the frontend.
|
||||
|
|
|
@ -381,7 +381,7 @@ void CodeGenAction::ExecuteAction() {
|
|||
// FIXME: This is stupid, IRReader shouldn't take ownership.
|
||||
llvm::MemoryBuffer *MainFileCopy =
|
||||
llvm::MemoryBuffer::getMemBufferCopy(MainFile->getBuffer(),
|
||||
getCurrentFile().c_str());
|
||||
getCurrentFile());
|
||||
|
||||
llvm::SMDiagnostic Err;
|
||||
TheModule.reset(ParseIR(MainFileCopy, Err, *VMContext));
|
||||
|
|
|
@ -1073,7 +1073,7 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
|
|||
CCInvocation(new CompilerInvocation(*Invocation));
|
||||
|
||||
Clang->setInvocation(CCInvocation.getPtr());
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].File;
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
|
||||
|
||||
// Set up diagnostics, capturing any diagnostics that would
|
||||
// otherwise be dropped.
|
||||
|
@ -1095,9 +1095,9 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
|
|||
|
||||
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
|
||||
"Invocation must have exactly one source file!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_AST &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
|
||||
"FIXME: AST inputs not yet supported here!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_LLVM_IR &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
|
||||
"IR inputs not support here!");
|
||||
|
||||
// Configure the various subsystems.
|
||||
|
@ -1242,7 +1242,7 @@ ASTUnit::ComputePreamble(CompilerInvocation &Invocation,
|
|||
// command line (to another file) or directly through the compiler invocation
|
||||
// (to a memory buffer).
|
||||
llvm::MemoryBuffer *Buffer = 0;
|
||||
llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].File);
|
||||
llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].getFile());
|
||||
if (const llvm::sys::FileStatus *MainFileStatus = MainFilePath.getFileStatus()) {
|
||||
// Check whether there is a file-file remapping of the main file
|
||||
for (PreprocessorOptions::remapped_file_iterator
|
||||
|
@ -1292,7 +1292,7 @@ ASTUnit::ComputePreamble(CompilerInvocation &Invocation,
|
|||
|
||||
// If the main source file was not remapped, load it now.
|
||||
if (!Buffer) {
|
||||
Buffer = getBufferForFile(FrontendOpts.Inputs[0].File);
|
||||
Buffer = getBufferForFile(FrontendOpts.Inputs[0].getFile());
|
||||
if (!Buffer)
|
||||
return std::make_pair((llvm::MemoryBuffer*)0, std::make_pair(0, true));
|
||||
|
||||
|
@ -1454,7 +1454,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
// buffer size we reserved when creating the preamble.
|
||||
return CreatePaddedMainFileBuffer(NewPreamble.first,
|
||||
PreambleReservedSize,
|
||||
FrontendOpts.Inputs[0].File);
|
||||
FrontendOpts.Inputs[0].getFile());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1507,7 +1507,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
|
||||
// Save the preamble text for later; we'll need to compare against it for
|
||||
// subsequent reparses.
|
||||
StringRef MainFilename = PreambleInvocation->getFrontendOpts().Inputs[0].File;
|
||||
StringRef MainFilename = PreambleInvocation->getFrontendOpts().Inputs[0].getFile();
|
||||
Preamble.assign(FileMgr->getFile(MainFilename),
|
||||
NewPreamble.first->getBufferStart(),
|
||||
NewPreamble.first->getBufferStart()
|
||||
|
@ -1517,7 +1517,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
delete PreambleBuffer;
|
||||
PreambleBuffer
|
||||
= llvm::MemoryBuffer::getNewUninitMemBuffer(PreambleReservedSize,
|
||||
FrontendOpts.Inputs[0].File);
|
||||
FrontendOpts.Inputs[0].getFile());
|
||||
memcpy(const_cast<char*>(PreambleBuffer->getBufferStart()),
|
||||
NewPreamble.first->getBufferStart(), Preamble.size());
|
||||
memset(const_cast<char*>(PreambleBuffer->getBufferStart()) + Preamble.size(),
|
||||
|
@ -1525,7 +1525,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
const_cast<char*>(PreambleBuffer->getBufferEnd())[-1] = '\n';
|
||||
|
||||
// Remap the main source file to the preamble buffer.
|
||||
llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].File);
|
||||
llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].getFile());
|
||||
PreprocessorOpts.addRemappedFile(MainFilePath.str(), PreambleBuffer);
|
||||
|
||||
// Tell the compiler invocation to generate a temporary precompiled header.
|
||||
|
@ -1543,7 +1543,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
CICleanup(Clang.get());
|
||||
|
||||
Clang->setInvocation(&*PreambleInvocation);
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].File;
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
|
||||
|
||||
// Set up diagnostics, capturing all of the diagnostics produced.
|
||||
Clang->setDiagnostics(&getDiagnostics());
|
||||
|
@ -1568,9 +1568,9 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
|
||||
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
|
||||
"Invocation must have exactly one source file!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_AST &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
|
||||
"FIXME: AST inputs not yet supported here!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_LLVM_IR &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
|
||||
"IR inputs not support here!");
|
||||
|
||||
// Clear out old caches and data.
|
||||
|
@ -1657,7 +1657,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
|
||||
return CreatePaddedMainFileBuffer(NewPreamble.first,
|
||||
PreambleReservedSize,
|
||||
FrontendOpts.Inputs[0].File);
|
||||
FrontendOpts.Inputs[0].getFile());
|
||||
}
|
||||
|
||||
void ASTUnit::RealizeTopLevelDeclsFromPreamble() {
|
||||
|
@ -1688,7 +1688,7 @@ void ASTUnit::transferASTDataFromCompilerInstance(CompilerInstance &CI) {
|
|||
}
|
||||
|
||||
StringRef ASTUnit::getMainFileName() const {
|
||||
return Invocation->getFrontendOpts().Inputs[0].File;
|
||||
return Invocation->getFrontendOpts().Inputs[0].getFile();
|
||||
}
|
||||
|
||||
ASTUnit *ASTUnit::create(CompilerInvocation *CI,
|
||||
|
@ -1765,7 +1765,7 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocationAction(CompilerInvocation *CI,
|
|||
CICleanup(Clang.get());
|
||||
|
||||
Clang->setInvocation(CI);
|
||||
AST->OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].File;
|
||||
AST->OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
|
||||
|
||||
// Set up diagnostics, capturing any diagnostics that would
|
||||
// otherwise be dropped.
|
||||
|
@ -1785,9 +1785,9 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocationAction(CompilerInvocation *CI,
|
|||
|
||||
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
|
||||
"Invocation must have exactly one source file!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_AST &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
|
||||
"FIXME: AST inputs not yet supported here!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_LLVM_IR &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
|
||||
"IR inputs not supported here!");
|
||||
|
||||
// Configure the various subsystems.
|
||||
|
@ -2358,7 +2358,7 @@ void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
|
|||
CICleanup(Clang.get());
|
||||
|
||||
Clang->setInvocation(&*CCInvocation);
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].File;
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
|
||||
|
||||
// Set up diagnostics, capturing any diagnostics produced.
|
||||
Clang->setDiagnostics(&Diag);
|
||||
|
@ -2383,9 +2383,9 @@ void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
|
|||
|
||||
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
|
||||
"Invocation must have exactly one source file!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_AST &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
|
||||
"FIXME: AST inputs not yet supported here!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].Kind != IK_LLVM_IR &&
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
|
||||
"IR inputs not support here!");
|
||||
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ ChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) {
|
|||
assert(!includes.empty() && "No '-chain-include' in options!");
|
||||
|
||||
OwningPtr<ChainedIncludesSource> source(new ChainedIncludesSource());
|
||||
InputKind IK = CI.getFrontendOpts().Inputs[0].Kind;
|
||||
InputKind IK = CI.getFrontendOpts().Inputs[0].getKind();
|
||||
|
||||
SmallVector<llvm::MemoryBuffer *, 4> serialBufs;
|
||||
SmallVector<std::string, 4> serialBufNames;
|
||||
|
|
|
@ -600,9 +600,9 @@ bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input,
|
|||
FileManager &FileMgr,
|
||||
SourceManager &SourceMgr,
|
||||
const FrontendOptions &Opts) {
|
||||
StringRef InputFile = Input.File;
|
||||
StringRef InputFile = Input.getFile();
|
||||
SrcMgr::CharacteristicKind
|
||||
Kind = Input.IsSystem ? SrcMgr::C_System : SrcMgr::C_User;
|
||||
Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User;
|
||||
|
||||
// Figure out where to get and map in the main file.
|
||||
if (InputFile != "-") {
|
||||
|
|
|
@ -161,17 +161,18 @@ ASTConsumer* FrontendAction::CreateWrappedASTConsumer(CompilerInstance &CI,
|
|||
bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||
const FrontendInputFile &Input) {
|
||||
assert(!Instance && "Already processing a source file!");
|
||||
assert(!Input.File.empty() && "Unexpected empty filename!");
|
||||
assert(!Input.isEmpty() && "Unexpected empty filename!");
|
||||
setCurrentInput(Input);
|
||||
setCompilerInstance(&CI);
|
||||
|
||||
StringRef InputFile = Input.getFile();
|
||||
bool HasBegunSourceFile = false;
|
||||
if (!BeginInvocation(CI))
|
||||
goto failure;
|
||||
|
||||
// AST files follow a very different path, since they share objects via the
|
||||
// AST unit.
|
||||
if (Input.Kind == IK_AST) {
|
||||
if (Input.getKind() == IK_AST) {
|
||||
assert(!usesPreprocessorOnly() &&
|
||||
"Attempt to pass AST file to preprocessor only action!");
|
||||
assert(hasASTFileSupport() &&
|
||||
|
@ -179,7 +180,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
|
||||
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(&CI.getDiagnostics());
|
||||
std::string Error;
|
||||
ASTUnit *AST = ASTUnit::LoadFromASTFile(Input.File, Diags,
|
||||
ASTUnit *AST = ASTUnit::LoadFromASTFile(InputFile, Diags,
|
||||
CI.getFileSystemOpts());
|
||||
if (!AST)
|
||||
goto failure;
|
||||
|
@ -194,11 +195,11 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
CI.setASTContext(&AST->getASTContext());
|
||||
|
||||
// Initialize the action.
|
||||
if (!BeginSourceFileAction(CI, Input.File))
|
||||
if (!BeginSourceFileAction(CI, InputFile))
|
||||
goto failure;
|
||||
|
||||
/// Create the AST consumer.
|
||||
CI.setASTConsumer(CreateWrappedASTConsumer(CI, Input.File));
|
||||
CI.setASTConsumer(CreateWrappedASTConsumer(CI, InputFile));
|
||||
if (!CI.hasASTConsumer())
|
||||
goto failure;
|
||||
|
||||
|
@ -212,7 +213,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
CI.createSourceManager(CI.getFileManager());
|
||||
|
||||
// IR files bypass the rest of initialization.
|
||||
if (Input.Kind == IK_LLVM_IR) {
|
||||
if (Input.getKind() == IK_LLVM_IR) {
|
||||
assert(hasIRSupport() &&
|
||||
"This action does not have IR file support!");
|
||||
|
||||
|
@ -221,7 +222,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
HasBegunSourceFile = true;
|
||||
|
||||
// Initialize the action.
|
||||
if (!BeginSourceFileAction(CI, Input.File))
|
||||
if (!BeginSourceFileAction(CI, InputFile))
|
||||
goto failure;
|
||||
|
||||
return true;
|
||||
|
@ -275,7 +276,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
HasBegunSourceFile = true;
|
||||
|
||||
// Initialize the action.
|
||||
if (!BeginSourceFileAction(CI, Input.File))
|
||||
if (!BeginSourceFileAction(CI, InputFile))
|
||||
goto failure;
|
||||
|
||||
/// Create the AST context and consumer unless this is a preprocessor only
|
||||
|
@ -284,7 +285,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
CI.createASTContext();
|
||||
|
||||
OwningPtr<ASTConsumer> Consumer(
|
||||
CreateWrappedASTConsumer(CI, Input.File));
|
||||
CreateWrappedASTConsumer(CI, InputFile));
|
||||
if (!Consumer)
|
||||
goto failure;
|
||||
|
||||
|
|
Loading…
Reference in New Issue