Move CompilerInstance::LLVMContext and LLVMContext ownership to CodeGenAction

This removes the final dependency edge from any lib outside of CodeGen
to core.  As a result we can, and do, trim the dependency on core
from libclang, PrintFunctionNames, the unit tests and c-index-test.
While at it, review and trim other unneeded dependencies.

llvm-svn: 125820
This commit is contained in:
Peter Collingbourne 2011-02-18 02:25:12 +00:00
parent 3ae6caaf1b
commit 14a552b2d7
16 changed files with 52 additions and 87 deletions

View File

@ -1,34 +1,11 @@
set(MODULE TRUE)
set( LLVM_USED_LIBS
clangFrontendTool
clangFrontend
clangDriver
clangSerialization
clangCodeGen
clangParse
clangSema
clangStaticAnalyzerFrontend
clangStaticAnalyzerCheckers
clangStaticAnalyzerCore
clangAnalysis
clangIndex
clangRewrite
clangAST
clangLex
clangBasic
)
# Why do we have to link to all this just to print out function names?
set( LLVM_LINK_COMPONENTS
${LLVM_TARGETS_TO_BUILD}
asmparser
bitreader
bitwriter
codegen
ipo
selectiondag
)
set( LLVM_LINK_COMPONENTS support mc)
add_clang_library(PrintFunctionNames PrintFunctionNames.cpp)

View File

@ -17,7 +17,6 @@
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Config/config.h"
#include "llvm/ADT/OwningPtr.h"
@ -130,7 +129,6 @@ int main(int argc, const char **argv, char * const *envp) {
// Create a compiler instance to handle the actual work.
CompilerInstance Clang;
Clang.setLLVMContext(new llvm::LLVMContext);
Clang.setInvocation(CI.take());
// Create the compilers actual diagnostics engine.

View File

@ -14,6 +14,7 @@
#include "llvm/ADT/OwningPtr.h"
namespace llvm {
class LLVMContext;
class Module;
}
@ -24,9 +25,14 @@ class CodeGenAction : public ASTFrontendAction {
private:
unsigned Act;
llvm::OwningPtr<llvm::Module> TheModule;
llvm::LLVMContext *VMContext;
bool OwnsVMContext;
protected:
CodeGenAction(unsigned _Act);
/// Create a new code generation action. If the optional \arg _VMContext
/// parameter is supplied, the action uses it without taking ownership,
/// otherwise it creates a fresh LLVM context and takes ownership.
CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = 0);
virtual bool hasIRSupport() const;
@ -44,37 +50,40 @@ public:
/// been run. The result may be null on failure.
llvm::Module *takeModule();
/// Take the LLVM context used by this action.
llvm::LLVMContext *takeLLVMContext();
BackendConsumer *BEConsumer;
};
class EmitAssemblyAction : public CodeGenAction {
public:
EmitAssemblyAction();
EmitAssemblyAction(llvm::LLVMContext *_VMContext = 0);
};
class EmitBCAction : public CodeGenAction {
public:
EmitBCAction();
EmitBCAction(llvm::LLVMContext *_VMContext = 0);
};
class EmitLLVMAction : public CodeGenAction {
public:
EmitLLVMAction();
EmitLLVMAction(llvm::LLVMContext *_VMContext = 0);
};
class EmitLLVMOnlyAction : public CodeGenAction {
public:
EmitLLVMOnlyAction();
EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = 0);
};
class EmitCodeGenOnlyAction : public CodeGenAction {
public:
EmitCodeGenOnlyAction();
EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = 0);
};
class EmitObjAction : public CodeGenAction {
public:
EmitObjAction();
EmitObjAction(llvm::LLVMContext *_VMContext = 0);
};
}

View File

@ -18,8 +18,6 @@
namespace llvm {
class raw_ostream;
class Module;
class LLVMContext;
namespace sys { class Path; }
}
namespace clang {

View File

@ -19,7 +19,6 @@
#include <string>
namespace llvm {
class LLVMContext;
class raw_ostream;
class raw_fd_ostream;
class Timer;
@ -59,9 +58,6 @@ class TargetInfo;
/// come in two forms; a short form that reuses the CompilerInstance objects,
/// and a long form that takes explicit instances of any required objects.
class CompilerInstance {
/// The LLVM context used for this instance.
llvm::OwningPtr<llvm::LLVMContext> LLVMContext;
/// The options used in this compiler instance.
llvm::OwningPtr<CompilerInvocation> Invocation;
@ -154,23 +150,6 @@ public:
// of the context or else not CompilerInstance specific.
bool ExecuteAction(FrontendAction &Act);
/// }
/// @name LLVM Context
/// {
bool hasLLVMContext() const { return LLVMContext != 0; }
llvm::LLVMContext &getLLVMContext() const {
assert(LLVMContext && "Compiler instance has no LLVM context!");
return *LLVMContext;
}
llvm::LLVMContext *takeLLVMContext() { return LLVMContext.take(); }
/// setLLVMContext - Replace the current LLVM context and take ownership of
/// \arg Value.
void setLLVMContext(llvm::LLVMContext *Value);
/// }
/// @name Compiler Invocation and Options
/// {

View File

@ -224,9 +224,15 @@ void BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D,
//
CodeGenAction::CodeGenAction(unsigned _Act) : Act(_Act) {}
CodeGenAction::CodeGenAction(unsigned _Act, LLVMContext *_VMContext)
: Act(_Act), VMContext(_VMContext ? _VMContext : new LLVMContext),
OwnsVMContext(!_VMContext) {}
CodeGenAction::~CodeGenAction() {}
CodeGenAction::~CodeGenAction() {
TheModule.reset();
if (OwnsVMContext)
delete VMContext;
}
bool CodeGenAction::hasIRSupport() const { return true; }
@ -243,6 +249,11 @@ llvm::Module *CodeGenAction::takeModule() {
return TheModule.take();
}
llvm::LLVMContext *CodeGenAction::takeLLVMContext() {
OwnsVMContext = false;
return VMContext;
}
static raw_ostream *GetOutputStream(CompilerInstance &CI,
llvm::StringRef InFile,
BackendAction Action) {
@ -275,7 +286,7 @@ ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
new BackendConsumer(BA, CI.getDiagnostics(),
CI.getCodeGenOpts(), CI.getTargetOpts(),
CI.getFrontendOpts().ShowTimers, InFile, OS.take(),
CI.getLLVMContext());
*VMContext);
return BEConsumer;
}
@ -301,7 +312,7 @@ void CodeGenAction::ExecuteAction() {
getCurrentFile().c_str());
llvm::SMDiagnostic Err;
TheModule.reset(ParseIR(MainFileCopy, Err, CI.getLLVMContext()));
TheModule.reset(ParseIR(MainFileCopy, Err, *VMContext));
if (!TheModule) {
// Translate from the diagnostic info to the SourceManager location.
SourceLocation Loc = SM.getLocation(
@ -332,15 +343,20 @@ void CodeGenAction::ExecuteAction() {
//
EmitAssemblyAction::EmitAssemblyAction()
: CodeGenAction(Backend_EmitAssembly) {}
EmitAssemblyAction::EmitAssemblyAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitAssembly, _VMContext) {}
EmitBCAction::EmitBCAction() : CodeGenAction(Backend_EmitBC) {}
EmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitBC, _VMContext) {}
EmitLLVMAction::EmitLLVMAction() : CodeGenAction(Backend_EmitLL) {}
EmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitLL, _VMContext) {}
EmitLLVMOnlyAction::EmitLLVMOnlyAction() : CodeGenAction(Backend_EmitNothing) {}
EmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitNothing, _VMContext) {}
EmitCodeGenOnlyAction::EmitCodeGenOnlyAction() : CodeGenAction(Backend_EmitMCNull) {}
EmitCodeGenOnlyAction::EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitMCNull, _VMContext) {}
EmitObjAction::EmitObjAction() : CodeGenAction(Backend_EmitObj) {}
EmitObjAction::EmitObjAction(llvm::LLVMContext *_VMContext)
: CodeGenAction(Backend_EmitObj, _VMContext) {}

View File

@ -27,7 +27,6 @@
#include "clang/Frontend/Utils.h"
#include "clang/Serialization/ASTReader.h"
#include "clang/Sema/CodeCompleteConsumer.h"
#include "llvm/LLVMContext.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
@ -47,10 +46,6 @@ CompilerInstance::CompilerInstance()
CompilerInstance::~CompilerInstance() {
}
void CompilerInstance::setLLVMContext(llvm::LLVMContext *Value) {
LLVMContext.reset(Value);
}
void CompilerInstance::setInvocation(CompilerInvocation *Value) {
Invocation.reset(Value);
}

View File

@ -1,9 +1,8 @@
set(LLVM_USED_LIBS libclang)
set( LLVM_LINK_COMPONENTS
bitreader
support
mc
core
)
add_clang_executable(c-index-test

View File

@ -13,7 +13,7 @@ TOOLNAME = c-index-test
# No plugins, optimize startup time.
TOOL_NO_EXPORTS = 1
LINK_COMPONENTS := bitreader mc core
LINK_COMPONENTS := support mc
USEDLIBS = clang.a clangIndex.a clangFrontend.a clangDriver.a \
clangSerialization.a clangParse.a clangSema.a clangAnalysis.a \
clangAST.a clangLex.a clangBasic.a

View File

@ -24,7 +24,6 @@
#include "clang/Frontend/TextDiagnosticBuffer.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
#include "clang/FrontendTool/Utils.h"
#include "llvm/LLVMContext.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
@ -118,8 +117,6 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd,
llvm::OwningPtr<CompilerInstance> Clang(new CompilerInstance());
llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
Clang->setLLVMContext(new llvm::LLVMContext());
// Run clang -cc1 test.
if (ArgBegin != ArgEnd && llvm::StringRef(ArgBegin[0]) == "-cc1test") {
Diagnostic Diags(DiagID, new TextDiagnosticPrinter(llvm::errs(),

View File

@ -11,9 +11,8 @@ set(LLVM_USED_LIBS
clangBasic)
set( LLVM_LINK_COMPONENTS
bitreader
support
mc
core
)
add_clang_library(libclang

View File

@ -15,7 +15,7 @@ EXPORTED_SYMBOL_FILE = $(PROJ_SRC_DIR)/libclang.exports
LINK_LIBS_IN_SHARED = 1
SHARED_LIBRARY = 1
LINK_COMPONENTS := bitreader mc core
LINK_COMPONENTS := support mc
USEDLIBS = clangFrontend.a clangDriver.a clangSerialization.a clangParse.a \
clangSema.a clangAnalysis.a clangAST.a clangLex.a clangBasic.a

View File

@ -9,7 +9,7 @@
CLANG_LEVEL = ../..
TESTNAME = Basic
LINK_COMPONENTS := core support mc
LINK_COMPONENTS := support mc
USEDLIBS = clangBasic.a
include $(CLANG_LEVEL)/unittests/Makefile

View File

@ -37,13 +37,13 @@ if(SUPPORTS_NO_VARIADIC_MACROS_FLAG)
endif()
add_clang_unittest(Basic
"Core"
"support mc"
"gtest gtest_main clangBasic"
Basic/FileManagerTest.cpp
)
add_clang_unittest(Frontend
"Core"
"support mc"
"gtest gtest_main clangFrontend"
Frontend/FrontendActionTest.cpp
)

View File

@ -14,7 +14,6 @@
#include "clang/Frontend/FrontendAction.h"
#include "llvm/ADT/Triple.h"
#include "llvm/LLVMContext.h"
#include "llvm/Support/MemoryBuffer.h"
#include "gtest/gtest.h"
@ -61,7 +60,6 @@ TEST(ASTFrontendAction, Sanity) {
invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
CompilerInstance compiler;
compiler.setLLVMContext(new LLVMContext);
compiler.setInvocation(invocation);
compiler.createDiagnostics(0, NULL);

View File

@ -9,7 +9,7 @@
CLANG_LEVEL = ../..
TESTNAME = Frontend
LINK_COMPONENTS := core support mc
LINK_COMPONENTS := support mc
USEDLIBS = clangFrontendTool.a clangFrontend.a clangDriver.a \
clangSerialization.a clangCodeGen.a clangParse.a clangSema.a \
clangStaticAnalyzerCheckers.a clangStaticAnalyzerCore.a \