@@ -126,40 +126,49 @@ static Expected<std::optional<uint32_t>> parseToleranceOption(StringRef Arg) {
126
126
// Initialization.
127
127
// ===----------------------------------------------------------------------===//
128
128
129
- CompilerInvocationRefBase::CompilerInvocationRefBase ()
130
- : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()),
131
- DiagnosticOpts(new DiagnosticOptions()),
132
- HeaderSearchOpts(new HeaderSearchOptions()),
133
- PreprocessorOpts(new PreprocessorOptions()),
134
- AnalyzerOpts(new AnalyzerOptions()) {}
135
-
136
- CompilerInvocationRefBase::CompilerInvocationRefBase (
137
- const CompilerInvocationRefBase &X)
138
- : LangOpts(new LangOptions(X.getLangOpts())),
139
- TargetOpts(new TargetOptions(X.getTargetOpts())),
140
- DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())),
141
- HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())),
142
- PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())),
143
- AnalyzerOpts(new AnalyzerOptions(X.getAnalyzerOpts())) {}
144
-
145
- CompilerInvocationRefBase::CompilerInvocationRefBase (
146
- CompilerInvocationRefBase &&X) = default;
147
-
148
- CompilerInvocationRefBase &
149
- CompilerInvocationRefBase::operator =(CompilerInvocationRefBase X) {
150
- LangOpts.swap (X.LangOpts );
151
- TargetOpts.swap (X.TargetOpts );
152
- DiagnosticOpts.swap (X.DiagnosticOpts );
153
- HeaderSearchOpts.swap (X.HeaderSearchOpts );
154
- PreprocessorOpts.swap (X.PreprocessorOpts );
155
- AnalyzerOpts.swap (X.AnalyzerOpts );
156
- return *this ;
129
+ namespace {
130
+ template <class T > std::shared_ptr<T> make_shared_copy (const T &X) {
131
+ return std::make_shared<T>(X);
157
132
}
158
133
159
- CompilerInvocationRefBase &
160
- CompilerInvocationRefBase::operator =(CompilerInvocationRefBase &&X) = default ;
161
-
162
- CompilerInvocationRefBase::~CompilerInvocationRefBase () = default ;
134
+ template <class T >
135
+ llvm::IntrusiveRefCntPtr<T> makeIntrusiveRefCntCopy (const T &X) {
136
+ return llvm::makeIntrusiveRefCnt<T>(X);
137
+ }
138
+ } // namespace
139
+
140
+ CompilerInvocationBase::CompilerInvocationBase ()
141
+ : LangOpts(std::make_shared<LangOptions>()),
142
+ TargetOpts(std::make_shared<TargetOptions>()),
143
+ DiagnosticOpts(llvm::makeIntrusiveRefCnt<DiagnosticOptions>()),
144
+ HSOpts(std::make_shared<HeaderSearchOptions>()),
145
+ PPOpts(std::make_shared<PreprocessorOptions>()),
146
+ AnalyzerOpts(llvm::makeIntrusiveRefCnt<AnalyzerOptions>()),
147
+ MigratorOpts(std::make_shared<MigratorOptions>()),
148
+ CodeGenOpts(std::make_shared<CodeGenOptions>()),
149
+ FSOpts(std::make_shared<FileSystemOptions>()),
150
+ FrontendOpts(std::make_shared<FrontendOptions>()),
151
+ DependencyOutputOpts(std::make_shared<DependencyOutputOptions>()),
152
+ PreprocessorOutputOpts(std::make_shared<PreprocessorOutputOptions>()) {}
153
+
154
+ CompilerInvocationBase &
155
+ CompilerInvocationBase::operator =(const CompilerInvocationBase &X) {
156
+ if (this != &X) {
157
+ LangOpts = make_shared_copy (X.getLangOpts ());
158
+ TargetOpts = make_shared_copy (X.getTargetOpts ());
159
+ DiagnosticOpts = makeIntrusiveRefCntCopy (X.getDiagnosticOpts ());
160
+ HSOpts = make_shared_copy (X.getHeaderSearchOpts ());
161
+ PPOpts = make_shared_copy (X.getPreprocessorOpts ());
162
+ AnalyzerOpts = makeIntrusiveRefCntCopy (X.getAnalyzerOpts ());
163
+ MigratorOpts = make_shared_copy (X.getMigratorOpts ());
164
+ CodeGenOpts = make_shared_copy (X.getCodeGenOpts ());
165
+ FSOpts = make_shared_copy (X.getFileSystemOpts ());
166
+ FrontendOpts = make_shared_copy (X.getFrontendOpts ());
167
+ DependencyOutputOpts = make_shared_copy (X.getDependencyOutputOpts ());
168
+ PreprocessorOutputOpts = make_shared_copy (X.getPreprocessorOutputOpts ());
169
+ }
170
+ return *this ;
171
+ }
163
172
164
173
// ===----------------------------------------------------------------------===//
165
174
// Normalizers
@@ -838,7 +847,7 @@ static void getAllNoBuiltinFuncValues(ArgList &Args,
838
847
Funcs.insert (Funcs.end (), Values.begin (), BuiltinEnd);
839
848
}
840
849
841
- static void GenerateAnalyzerArgs (AnalyzerOptions &Opts,
850
+ static void GenerateAnalyzerArgs (const AnalyzerOptions &Opts,
842
851
ArgumentConsumer Consumer) {
843
852
const AnalyzerOptions *AnalyzerOpts = &Opts;
844
853
@@ -2917,7 +2926,7 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
2917
2926
return Driver::GetResourcesPath (ClangExecutable, CLANG_RESOURCE_DIR);
2918
2927
}
2919
2928
2920
- static void GenerateHeaderSearchArgs (HeaderSearchOptions &Opts,
2929
+ static void GenerateHeaderSearchArgs (const HeaderSearchOptions &Opts,
2921
2930
ArgumentConsumer Consumer) {
2922
2931
const HeaderSearchOptions *HeaderSearchOpts = &Opts;
2923
2932
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING (...) \
@@ -4103,12 +4112,12 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
4103
4112
llvm_unreachable (" invalid frontend action" );
4104
4113
}
4105
4114
4106
- static void GeneratePreprocessorArgs (PreprocessorOptions &Opts,
4115
+ static void GeneratePreprocessorArgs (const PreprocessorOptions &Opts,
4107
4116
ArgumentConsumer Consumer,
4108
4117
const LangOptions &LangOpts,
4109
4118
const FrontendOptions &FrontendOpts,
4110
4119
const CodeGenOptions &CodeGenOpts) {
4111
- PreprocessorOptions *PreprocessorOpts = &Opts;
4120
+ const PreprocessorOptions *PreprocessorOpts = &Opts;
4112
4121
4113
4122
#define PREPROCESSOR_OPTION_WITH_MARSHALLING (...) \
4114
4123
GENERATE_OPTION_WITH_MARSHALLING (Consumer, __VA_ARGS__)
@@ -4514,15 +4523,15 @@ std::string CompilerInvocation::getModuleHash() const {
4514
4523
#define BENIGN_ENUM_LANGOPT (Name, Type, Bits, Default, Description )
4515
4524
#include " clang/Basic/LangOptions.def"
4516
4525
4517
- HBuilder.addRange (LangOpts-> ModuleFeatures );
4526
+ HBuilder.addRange (getLangOpts (). ModuleFeatures );
4518
4527
4519
- HBuilder.add (LangOpts-> ObjCRuntime );
4520
- HBuilder.addRange (LangOpts-> CommentOpts .BlockCommandNames );
4528
+ HBuilder.add (getLangOpts (). ObjCRuntime );
4529
+ HBuilder.addRange (getLangOpts (). CommentOpts .BlockCommandNames );
4521
4530
4522
4531
// Extend the signature with the target options.
4523
- HBuilder.add (TargetOpts-> Triple , TargetOpts-> CPU , TargetOpts-> TuneCPU ,
4524
- TargetOpts-> ABI );
4525
- HBuilder.addRange (TargetOpts-> FeaturesAsWritten );
4532
+ HBuilder.add (getTargetOpts (). Triple , getTargetOpts (). CPU ,
4533
+ getTargetOpts (). TuneCPU , getTargetOpts (). ABI );
4534
+ HBuilder.addRange (getTargetOpts (). FeaturesAsWritten );
4526
4535
4527
4536
// Extend the signature with preprocessor options.
4528
4537
const PreprocessorOptions &ppOpts = getPreprocessorOpts ();
@@ -4577,7 +4586,7 @@ std::string CompilerInvocation::getModuleHash() const {
4577
4586
4578
4587
// Extend the signature with the enabled sanitizers, if at least one is
4579
4588
// enabled. Sanitizers which cannot affect AST generation aren't hashed.
4580
- SanitizerSet SanHash = LangOpts-> Sanitize ;
4589
+ SanitizerSet SanHash = getLangOpts (). Sanitize ;
4581
4590
SanHash.clear (getPPTransparentSanitizers ());
4582
4591
if (!SanHash.empty ())
4583
4592
HBuilder.add (SanHash.Mask );
@@ -4590,23 +4599,24 @@ std::string CompilerInvocation::getModuleHash() const {
4590
4599
4591
4600
void CompilerInvocation::generateCC1CommandLine (
4592
4601
ArgumentConsumer Consumer) const {
4593
- llvm::Triple T (TargetOpts->Triple );
4594
-
4595
- GenerateFileSystemArgs (FileSystemOpts, Consumer);
4596
- GenerateMigratorArgs (MigratorOpts, Consumer);
4597
- GenerateAnalyzerArgs (*AnalyzerOpts, Consumer);
4598
- GenerateDiagnosticArgs (*DiagnosticOpts, Consumer, false );
4599
- GenerateFrontendArgs (FrontendOpts, Consumer, LangOpts->IsHeaderFile );
4600
- GenerateTargetArgs (*TargetOpts, Consumer);
4601
- GenerateHeaderSearchArgs (*HeaderSearchOpts, Consumer);
4602
- GenerateLangArgs (*LangOpts, Consumer, T, FrontendOpts.DashX );
4603
- GenerateCodeGenArgs (CodeGenOpts, Consumer, T, FrontendOpts.OutputFile ,
4604
- &*LangOpts);
4605
- GeneratePreprocessorArgs (*PreprocessorOpts, Consumer, *LangOpts, FrontendOpts,
4606
- CodeGenOpts);
4607
- GeneratePreprocessorOutputArgs (PreprocessorOutputOpts, Consumer,
4608
- FrontendOpts.ProgramAction );
4609
- GenerateDependencyOutputArgs (DependencyOutputOpts, Consumer);
4602
+ llvm::Triple T (getTargetOpts ().Triple );
4603
+
4604
+ GenerateFileSystemArgs (getFileSystemOpts (), Consumer);
4605
+ GenerateMigratorArgs (getMigratorOpts (), Consumer);
4606
+ GenerateAnalyzerArgs (getAnalyzerOpts (), Consumer);
4607
+ GenerateDiagnosticArgs (getDiagnosticOpts (), Consumer,
4608
+ /* DefaultDiagColor=*/ false );
4609
+ GenerateFrontendArgs (getFrontendOpts (), Consumer, getLangOpts ().IsHeaderFile );
4610
+ GenerateTargetArgs (getTargetOpts (), Consumer);
4611
+ GenerateHeaderSearchArgs (getHeaderSearchOpts (), Consumer);
4612
+ GenerateLangArgs (getLangOpts (), Consumer, T, getFrontendOpts ().DashX );
4613
+ GenerateCodeGenArgs (getCodeGenOpts (), Consumer, T,
4614
+ getFrontendOpts ().OutputFile , &getLangOpts ());
4615
+ GeneratePreprocessorArgs (getPreprocessorOpts (), Consumer, getLangOpts (),
4616
+ getFrontendOpts (), getCodeGenOpts ());
4617
+ GeneratePreprocessorOutputArgs (getPreprocessorOutputOpts (), Consumer,
4618
+ getFrontendOpts ().ProgramAction );
4619
+ GenerateDependencyOutputArgs (getDependencyOutputOpts (), Consumer);
4610
4620
}
4611
4621
4612
4622
std::vector<std::string> CompilerInvocation::getCC1CommandLine () const {
0 commit comments