@@ -2072,57 +2072,8 @@ int swift::performFrontend(ArrayRef<const char *> Args,
2072
2072
PDC.setSuppressOutput (true );
2073
2073
}
2074
2074
2075
- // Because the serialized diagnostics consumer is initialized here,
2076
- // diagnostics emitted above, within CompilerInvocation::parseArgs, are never
2077
- // serialized. This is a non-issue because, in nearly all cases, frontend
2078
- // arguments are generated by the driver, not directly by a user. The driver
2079
- // is responsible for emitting diagnostics for its own errors. See SR-2683
2080
- // for details.
2081
- std::unique_ptr<DiagnosticConsumer> SerializedConsumerDispatcher =
2082
- createSerializedDiagnosticConsumerIfNeeded (
2083
- Invocation.getFrontendOptions ().InputsAndOutputs );
2084
- if (SerializedConsumerDispatcher)
2085
- Instance->addDiagnosticConsumer (SerializedConsumerDispatcher.get ());
2086
-
2087
- std::unique_ptr<DiagnosticConsumer> FixItsConsumer =
2088
- createJSONFixItDiagnosticConsumerIfNeeded (Invocation);
2089
- if (FixItsConsumer)
2090
- Instance->addDiagnosticConsumer (FixItsConsumer.get ());
2091
-
2092
- if (Invocation.getDiagnosticOptions ().UseColor )
2093
- PDC.forceColors ();
2094
-
2095
- PDC.setPrintEducationalNotes (
2096
- Invocation.getDiagnosticOptions ().PrintEducationalNotes );
2097
-
2098
- PDC.setFormattingStyle (
2099
- Invocation.getDiagnosticOptions ().PrintedFormattingStyle );
2100
-
2101
- if (Invocation.getFrontendOptions ().PrintStats ) {
2102
- llvm::EnableStatistics ();
2103
- }
2104
-
2105
- const DiagnosticOptions &diagOpts = Invocation.getDiagnosticOptions ();
2106
- bool verifierEnabled = diagOpts.VerifyMode != DiagnosticOptions::NoVerify;
2107
-
2108
- std::string InstanceSetupError;
2109
- if (Instance->setup (Invocation, InstanceSetupError)) {
2110
- return finishDiagProcessing (1 , /* verifierEnabled*/ false );
2111
- }
2112
-
2113
- // The compiler instance has been configured; notify our observer.
2114
- if (observer) {
2115
- observer->configuredCompiler (*Instance);
2116
- }
2117
-
2118
- if (verifierEnabled) {
2119
- // Suppress printed diagnostic output during the compile if the verifier is
2120
- // enabled.
2121
- PDC.setSuppressOutput (true );
2122
- }
2123
-
2124
- if (Invocation.getFrontendOptions ().FrontendParseableOutput ) {
2125
- const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
2075
+ auto emitParseableBeganMessage = [&Invocation, &Args]() {
2076
+ const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
2126
2077
const auto OSPid = getpid ();
2127
2078
const auto ProcInfo = sys::TaskProcessInformation (OSPid);
2128
2079
@@ -2151,27 +2102,9 @@ int swift::performFrontend(ArrayRef<const char *> Args,
2151
2102
constructDetailedTaskDescription (Invocation, IO.getAllInputs (), Args),
2152
2103
OSPid, ProcInfo);
2153
2104
}
2154
- }
2155
-
2156
- int ReturnValue = 0 ;
2157
- bool HadError = performCompile (*Instance, ReturnValue, observer);
2158
-
2159
- if (verifierEnabled) {
2160
- DiagnosticEngine &diags = Instance->getDiags ();
2161
- if (diags.hasFatalErrorOccurred () &&
2162
- !Invocation.getDiagnosticOptions ().ShowDiagnosticsAfterFatalError ) {
2163
- diags.resetHadAnyError ();
2164
- PDC.setSuppressOutput (false );
2165
- diags.diagnose (SourceLoc (), diag::verify_encountered_fatal);
2166
- HadError = true ;
2167
- }
2168
- }
2169
-
2170
- auto r = finishDiagProcessing (HadError ? 1 : ReturnValue, verifierEnabled);
2171
- if (auto *StatsReporter = Instance->getStatsReporter ())
2172
- StatsReporter->noteCurrentProcessExitStatus (r);
2105
+ };
2173
2106
2174
- if ( Invocation. getFrontendOptions (). FrontendParseableOutput ) {
2107
+ auto emitParseableFinishedMessage = [& Invocation, &Args, &FileSpecificDiagnostics]( int ExitStatus ) {
2175
2108
const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
2176
2109
const auto OSPid = getpid ();
2177
2110
const auto ProcInfo = sys::TaskProcessInformation (OSPid);
@@ -2197,7 +2130,7 @@ int swift::performFrontend(ArrayRef<const char *> Args,
2197
2130
2198
2131
emitFinishedMessage (llvm::errs (),
2199
2132
mapFrontendInvocationToAction (Invocation),
2200
- JoinedDiags.str (), r , Pid - idx, ProcInfo);
2133
+ JoinedDiags.str (), ExitStatus , Pid - idx, ProcInfo);
2201
2134
return false ;
2202
2135
});
2203
2136
} else {
@@ -2214,10 +2147,88 @@ int swift::performFrontend(ArrayRef<const char *> Args,
2214
2147
std::ostream_iterator<std::string>(JoinedDiags, Delim));
2215
2148
emitFinishedMessage (llvm::errs (),
2216
2149
mapFrontendInvocationToAction (Invocation),
2217
- JoinedDiags.str (), r , OSPid, ProcInfo);
2150
+ JoinedDiags.str (), ExitStatus , OSPid, ProcInfo);
2218
2151
}
2152
+ };
2153
+
2154
+ // Because the serialized diagnostics consumer is initialized here,
2155
+ // diagnostics emitted above, within CompilerInvocation::parseArgs, are never
2156
+ // serialized. This is a non-issue because, in nearly all cases, frontend
2157
+ // arguments are generated by the driver, not directly by a user. The driver
2158
+ // is responsible for emitting diagnostics for its own errors. See SR-2683
2159
+ // for details.
2160
+ std::unique_ptr<DiagnosticConsumer> SerializedConsumerDispatcher =
2161
+ createSerializedDiagnosticConsumerIfNeeded (
2162
+ Invocation.getFrontendOptions ().InputsAndOutputs );
2163
+ if (SerializedConsumerDispatcher)
2164
+ Instance->addDiagnosticConsumer (SerializedConsumerDispatcher.get ());
2165
+
2166
+ std::unique_ptr<DiagnosticConsumer> FixItsConsumer =
2167
+ createJSONFixItDiagnosticConsumerIfNeeded (Invocation);
2168
+ if (FixItsConsumer)
2169
+ Instance->addDiagnosticConsumer (FixItsConsumer.get ());
2170
+
2171
+ if (Invocation.getDiagnosticOptions ().UseColor )
2172
+ PDC.forceColors ();
2173
+
2174
+ PDC.setPrintEducationalNotes (
2175
+ Invocation.getDiagnosticOptions ().PrintEducationalNotes );
2176
+
2177
+ PDC.setFormattingStyle (
2178
+ Invocation.getDiagnosticOptions ().PrintedFormattingStyle );
2179
+
2180
+ if (Invocation.getFrontendOptions ().PrintStats ) {
2181
+ llvm::EnableStatistics ();
2219
2182
}
2220
2183
2184
+
2185
+ if (Invocation.getFrontendOptions ().FrontendParseableOutput )
2186
+ emitParseableBeganMessage ();
2187
+
2188
+ const DiagnosticOptions &diagOpts = Invocation.getDiagnosticOptions ();
2189
+ bool verifierEnabled = diagOpts.VerifyMode != DiagnosticOptions::NoVerify;
2190
+
2191
+ std::string InstanceSetupError;
2192
+ if (Instance->setup (Invocation, InstanceSetupError)) {
2193
+ int ReturnCode = 1 ;
2194
+ if (Invocation.getFrontendOptions ().FrontendParseableOutput )
2195
+ emitParseableFinishedMessage (ReturnCode);
2196
+
2197
+ return finishDiagProcessing (ReturnCode, /* verifierEnabled*/ false );
2198
+ }
2199
+
2200
+ // The compiler instance has been configured; notify our observer.
2201
+ if (observer) {
2202
+ observer->configuredCompiler (*Instance);
2203
+ }
2204
+
2205
+ if (verifierEnabled) {
2206
+ // Suppress printed diagnostic output during the compile if the verifier is
2207
+ // enabled.
2208
+ PDC.setSuppressOutput (true );
2209
+ }
2210
+
2211
+ int ReturnValue = 0 ;
2212
+ bool HadError = performCompile (*Instance, ReturnValue, observer);
2213
+
2214
+ if (verifierEnabled) {
2215
+ DiagnosticEngine &diags = Instance->getDiags ();
2216
+ if (diags.hasFatalErrorOccurred () &&
2217
+ !Invocation.getDiagnosticOptions ().ShowDiagnosticsAfterFatalError ) {
2218
+ diags.resetHadAnyError ();
2219
+ PDC.setSuppressOutput (false );
2220
+ diags.diagnose (SourceLoc (), diag::verify_encountered_fatal);
2221
+ HadError = true ;
2222
+ }
2223
+ }
2224
+
2225
+ auto r = finishDiagProcessing (HadError ? 1 : ReturnValue, verifierEnabled);
2226
+ if (auto *StatsReporter = Instance->getStatsReporter ())
2227
+ StatsReporter->noteCurrentProcessExitStatus (r);
2228
+
2229
+ if (Invocation.getFrontendOptions ().FrontendParseableOutput )
2230
+ emitParseableFinishedMessage (r);
2231
+
2221
2232
return r;
2222
2233
}
2223
2234
0 commit comments