forked from OSchip/llvm-project
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:
parent
f22fa9eaef
commit
2acedbd417
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue