Refine placement of LangOptions object in CompilerInvocation by adding a new baseclass CompilerInvocationBase with a custom copy constructor. This ensures that whenever the CompilerInvocation object's copy constructor is used we always clone the LangOptions object.

llvm-svn: 144973
This commit is contained in:
Ted Kremenek 2011-11-18 04:32:13 +00:00
parent f22fa9eaef
commit 2acedbd417
3 changed files with 20 additions and 16 deletions

View File

@ -30,15 +30,29 @@
namespace clang {
class CompilerInvocation;
class DiagnosticsEngine;
class CompilerInvocationBase : public llvm::RefCountedBase<CompilerInvocation> {
protected:
/// Options controlling the language variant.
llvm::IntrusiveRefCntPtr<LangOptions> LangOpts;
public:
CompilerInvocationBase();
CompilerInvocationBase(const CompilerInvocationBase &X);
LangOptions *getLangOpts() { return LangOpts.getPtr(); }
const LangOptions *getLangOpts() const { return LangOpts.getPtr(); }
};
/// CompilerInvocation - Helper class for holding the data necessary to invoke
/// the compiler.
///
/// This class is designed to represent an abstract "invocation" of the
/// compiler, including data such as the include paths, the code generation
/// options, the warning flags, and so on.
class CompilerInvocation : public llvm::RefCountedBase<CompilerInvocation> {
class CompilerInvocation : public CompilerInvocationBase {
/// Options controlling the static analyzer.
AnalyzerOptions AnalyzerOpts;
@ -60,9 +74,6 @@ class CompilerInvocation : public llvm::RefCountedBase<CompilerInvocation> {
/// Options controlling the #include directive.
HeaderSearchOptions HeaderSearchOpts;
/// Options controlling the language variant.
llvm::IntrusiveRefCntPtr<LangOptions> LangOpts;
/// Options controlling the preprocessor (aside from #include handling).
PreprocessorOptions PreprocessorOpts;
@ -73,7 +84,7 @@ class CompilerInvocation : public llvm::RefCountedBase<CompilerInvocation> {
TargetOptions TargetOpts;
public:
CompilerInvocation();
CompilerInvocation() {}
/// @name Utility Methods
/// @{
@ -111,7 +122,7 @@ public:
/// \param LangStd - The input language standard.
void setLangDefaults(InputKind IK,
LangStandard::Kind LangStd = LangStandard::lang_unspecified) {
setLangDefaults(*LangOpts, IK, LangStd);
setLangDefaults(*getLangOpts(), IK, LangStd);
}
/// setLangDefaults - Set language defaults for the given input language and
@ -166,11 +177,6 @@ public:
return FrontendOpts;
}
LangOptions *getLangOpts() { return LangOpts.getPtr(); }
const LangOptions *getLangOpts() const { return LangOpts.getPtr(); }
void setLangOpts(LangOptions *LangOpts);
PreprocessorOptions &getPreprocessorOpts() { return PreprocessorOpts; }
const PreprocessorOptions &getPreprocessorOpts() const {
return PreprocessorOpts;

View File

@ -190,7 +190,6 @@ createInvocationForMigration(CompilerInvocation &origCI) {
CInvok->getPreprocessorOpts().ImplicitPTHInclude = std::string();
std::string define = getARCMTMacroName();
define += '=';
CInvok->setLangOpts(new LangOptions(*CInvok->getLangOpts()));
CInvok->getPreprocessorOpts().addMacroDef(define);
CInvok->getLangOpts()->ObjCAutoRefCount = true;
CInvok->getLangOpts()->setGC(LangOptions::NonGC);

View File

@ -34,12 +34,11 @@ using namespace clang;
// Initialization.
//===----------------------------------------------------------------------===//
CompilerInvocation::CompilerInvocation()
CompilerInvocationBase::CompilerInvocationBase()
: LangOpts(new LangOptions()) {}
void CompilerInvocation::setLangOpts(LangOptions *LOpts) {
LangOpts = LOpts;
}
CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
: LangOpts(new LangOptions(*X.getLangOpts())) {}
//===----------------------------------------------------------------------===//
// Utility functions.