Skip to content

Commit b703cb9

Browse files
Add feature to produce serialized diagnostics files (#15600)
Using the `serialized_diagnostics_file` feature will add the `--serialized-diagnostics` flag to C/C++/Objective-C/Objective-C++ compiles, causing a declared`.dia` file output to be produced. (cherry picked from commit c8ea368)
1 parent 4d900ce commit b703cb9

14 files changed

+256
-9
lines changed

src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum ArtifactCategory {
2727
INTERFACE_LIBRARY("lib", ".ifso", ".tbd", ".if.lib"),
2828
PIC_FILE("", ".pic"),
2929
INCLUDED_FILE_LIST("", ".d"),
30+
SERIALIZED_DIAGNOSTICS_FILE("", ".dia"),
3031
OBJECT_FILE("", ".o", ".obj"),
3132
PIC_OBJECT_FILE("", ".pic.o"),
3233
CPP_MODULE("", ".pcm"),

src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -1540,8 +1540,8 @@ private Artifact createCompileActionTemplate(
15401540
SpecialArtifact outputFiles =
15411541
CppHelper.getCompileOutputTreeArtifact(
15421542
actionConstructionContext, label, sourceArtifact, outputName, usePic);
1543-
// Dotd file output is specified in the execution phase.
1544-
builder.setOutputs(outputFiles, /* dotdFile= */ null);
1543+
// Dotd and dia file outputs are specified in the execution phase.
1544+
builder.setOutputs(outputFiles, /* dotdFile= */ null, /* diagnosticsFile= */ null);
15451545
builder.setVariables(
15461546
setupCompileBuildVariables(
15471547
builder,
@@ -1563,11 +1563,18 @@ private Artifact createCompileActionTemplate(
15631563
CppHelper.getDotdOutputTreeArtifact(
15641564
actionConstructionContext, label, sourceArtifact, outputName, usePic);
15651565
}
1566+
SpecialArtifact diagnosticsTreeArtifact = null;
1567+
if (builder.serializedDiagnosticsFilesEnabled()) {
1568+
diagnosticsTreeArtifact =
1569+
CppHelper.getDiagnosticsOutputTreeArtifact(
1570+
actionConstructionContext, label, sourceArtifact, outputName, usePic);
1571+
}
15661572
CppCompileActionTemplate actionTemplate =
15671573
new CppCompileActionTemplate(
15681574
sourceArtifact,
15691575
outputFiles,
15701576
dotdTreeArtifact,
1577+
diagnosticsTreeArtifact,
15711578
builder,
15721579
ccToolchain,
15731580
outputCategories,
@@ -1627,6 +1634,10 @@ private CcToolchainVariables setupCompileBuildVariables(
16271634
if (builder.getDotdFile() != null) {
16281635
dotdFileExecPath = builder.getDotdFile().getExecPathString();
16291636
}
1637+
String diagnosticsFileExecPath = null;
1638+
if (builder.getDiagnosticsFile() != null) {
1639+
diagnosticsFileExecPath = builder.getDiagnosticsFile().getExecPathString();
1640+
}
16301641
if (needsFdoBuildVariables && fdoContext.hasArtifacts(cppConfiguration)) {
16311642
// This modifies the passed-in builder, which is a surprising side-effect, and makes it unsafe
16321643
// to call this method multiple times for the same builder.
@@ -1705,6 +1716,7 @@ private CcToolchainVariables setupCompileBuildVariables(
17051716
/* thinLtoOutputObjectFile= */ null,
17061717
getCopts(builder.getSourceFile(), sourceLabel),
17071718
dotdFileExecPath,
1719+
diagnosticsFileExecPath,
17081720
usePic,
17091721
ccCompilationContext.getExternalIncludeDirs(),
17101722
additionalBuildVariables);

src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java

+1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ public CcToolchainVariables getCompileBuildVariables(
305305
usePic,
306306
/* fdoStamp= */ null,
307307
/* dotdFileExecPath= */ null,
308+
/* diagnosticsFileExecPath= */ null,
308309
variablesExtensions,
309310
/* additionalBuildVariables= */ ImmutableMap.of(),
310311
/* directModuleMaps= */ ImmutableList.of(),

src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java

+15
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public enum CompileBuildVariables {
4444
OUTPUT_FILE("output_file"),
4545
/** Variable for the dependency file path */
4646
DEPENDENCY_FILE("dependency_file"),
47+
/** Variable for the serialized diagnostics file path */
48+
SERIALIZED_DIAGNOSTICS_FILE("serialized_diagnostics_file"),
4749
/** Variable for the module file name. */
4850
MODULE_NAME("module_name"),
4951
/**
@@ -151,6 +153,7 @@ public static CcToolchainVariables setupVariablesOrReportRuleError(
151153
boolean usePic,
152154
String fdoStamp,
153155
String dotdFileExecPath,
156+
String diagnosticsFileExecPath,
154157
ImmutableList<VariablesExtension> variablesExtensions,
155158
ImmutableMap<String, String> additionalBuildVariables,
156159
Iterable<Artifact> directModuleMaps,
@@ -184,6 +187,7 @@ public static CcToolchainVariables setupVariablesOrReportRuleError(
184187
usePic,
185188
fdoStamp,
186189
dotdFileExecPath,
190+
diagnosticsFileExecPath,
187191
variablesExtensions,
188192
additionalBuildVariables,
189193
directModuleMaps,
@@ -219,6 +223,7 @@ public static CcToolchainVariables setupVariablesOrThrowEvalException(
219223
boolean usePic,
220224
String fdoStamp,
221225
String dotdFileExecPath,
226+
String diagnosticsFileExecPath,
222227
ImmutableList<VariablesExtension> variablesExtensions,
223228
ImmutableMap<String, String> additionalBuildVariables,
224229
Iterable<Artifact> directModuleMaps,
@@ -252,6 +257,7 @@ public static CcToolchainVariables setupVariablesOrThrowEvalException(
252257
usePic,
253258
fdoStamp,
254259
dotdFileExecPath,
260+
diagnosticsFileExecPath,
255261
variablesExtensions,
256262
additionalBuildVariables,
257263
directModuleMaps,
@@ -281,6 +287,7 @@ private static CcToolchainVariables setupVariables(
281287
boolean usePic,
282288
String fdoStamp,
283289
String dotdFileExecPath,
290+
String diagnosticsFileExecPath,
284291
ImmutableList<VariablesExtension> variablesExtensions,
285292
ImmutableMap<String, String> additionalBuildVariables,
286293
Iterable<Artifact> directModuleMaps,
@@ -319,6 +326,7 @@ private static CcToolchainVariables setupVariables(
319326
thinLtoOutputObjectFile,
320327
userCompileFlags,
321328
dotdFileExecPath,
329+
diagnosticsFileExecPath,
322330
usePic,
323331
ImmutableList.of(),
324332
ImmutableMap.of());
@@ -338,6 +346,7 @@ public static void setupSpecificVariables(
338346
String thinLtoOutputObjectFile,
339347
Iterable<String> userCompileFlags,
340348
String dotdFileExecPath,
349+
String diagnosticsFileExecPath,
341350
boolean usePic,
342351
ImmutableList<PathFragment> externalIncludeDirs,
343352
Map<String, String> additionalBuildVariables) {
@@ -357,6 +366,12 @@ public static void setupSpecificVariables(
357366
buildVariables.addStringVariable(DEPENDENCY_FILE.getVariableName(), dotdFileExecPath);
358367
}
359368

369+
// Set diagnostics_file to enable <object>.dia file generation.
370+
if (diagnosticsFileExecPath != null) {
371+
buildVariables.addStringVariable(
372+
SERIALIZED_DIAGNOSTICS_FILE.getVariableName(), diagnosticsFileExecPath);
373+
}
374+
360375
if (gcnoFile != null) {
361376
buildVariables.addStringVariable(GCOV_GCNO_FILE.getVariableName(), gcnoFile);
362377
}

src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
222222
* not needed during actual execution.
223223
* @param outputFile the object file that is written as result of the compilation
224224
* @param dotdFile the .d file that is generated as a side-effect of compilation
225+
* @param diagnosticsFile the .dia file that is generated as a side-effect of compilation
225226
* @param gcnoFile the coverage notes that are written in coverage mode, can be null
226227
* @param dwoFile the .dwo output file where debug information is stored for Fission builds (null
227228
* if Fission mode is disabled)
@@ -250,6 +251,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
250251
NestedSet<Artifact> additionalPrunableHeaders,
251252
Artifact outputFile,
252253
@Nullable Artifact dotdFile,
254+
@Nullable Artifact diagnosticsFile,
253255
@Nullable Artifact gcnoFile,
254256
@Nullable Artifact dwoFile,
255257
@Nullable Artifact ltoIndexingFile,
@@ -269,7 +271,14 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
269271
NestedSetBuilder.fromNestedSet(mandatoryInputs)
270272
.addTransitive(inputsForInvalidation)
271273
.build(),
272-
collectOutputs(outputFile, dotdFile, gcnoFile, dwoFile, ltoIndexingFile, additionalOutputs),
274+
collectOutputs(
275+
outputFile,
276+
dotdFile,
277+
diagnosticsFile,
278+
gcnoFile,
279+
dwoFile,
280+
ltoIndexingFile,
281+
additionalOutputs),
273282
env);
274283
Preconditions.checkNotNull(outputFile);
275284
this.outputFile = outputFile;
@@ -290,7 +299,13 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
290299
Preconditions.checkNotNull(additionalIncludeScanningRoots);
291300
this.compileCommandLine =
292301
buildCommandLine(
293-
sourceFile, coptsFilter, actionName, dotdFile, featureConfiguration, variables);
302+
sourceFile,
303+
coptsFilter,
304+
actionName,
305+
dotdFile,
306+
diagnosticsFile,
307+
featureConfiguration,
308+
variables);
294309
this.executionInfo = executionInfo;
295310
this.actionName = actionName;
296311
this.featureConfiguration = featureConfiguration;
@@ -314,6 +329,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
314329
private static ImmutableSet<Artifact> collectOutputs(
315330
@Nullable Artifact outputFile,
316331
@Nullable Artifact dotdFile,
332+
@Nullable Artifact diagnosticsFile,
317333
@Nullable Artifact gcnoFile,
318334
@Nullable Artifact dwoFile,
319335
@Nullable Artifact ltoIndexingFile,
@@ -330,6 +346,9 @@ private static ImmutableSet<Artifact> collectOutputs(
330346
if (dotdFile != null) {
331347
outputs.add(dotdFile);
332348
}
349+
if (diagnosticsFile != null) {
350+
outputs.add(diagnosticsFile);
351+
}
333352
if (dwoFile != null) {
334353
outputs.add(dwoFile);
335354
}
@@ -344,6 +363,7 @@ static CompileCommandLine buildCommandLine(
344363
CoptsFilter coptsFilter,
345364
String actionName,
346365
Artifact dotdFile,
366+
Artifact diagnosticsFile,
347367
FeatureConfiguration featureConfiguration,
348368
CcToolchainVariables variables) {
349369
return CompileCommandLine.builder(sourceFile, coptsFilter, actionName, dotdFile)

src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class CppCompileActionBuilder {
5858
private Artifact dwoFile;
5959
private Artifact ltoIndexingFile;
6060
private Artifact dotdFile;
61+
private Artifact diagnosticsFile;
6162
private Artifact gcnoFile;
6263
private CcCompilationContext ccCompilationContext = CcCompilationContext.EMPTY;
6364
private final List<String> pluginOpts = new ArrayList<>();
@@ -292,6 +293,7 @@ public CppCompileAction buildAndVerify(Consumer<String> errorCollector) {
292293
prunableHeaders,
293294
outputFile,
294295
dotdFile,
296+
diagnosticsFile,
295297
gcnoFile,
296298
dwoFile,
297299
ltoIndexingFile,
@@ -446,9 +448,15 @@ public boolean dotdFilesEnabled() {
446448
&& !featureConfiguration.isEnabled(CppRuleClasses.PARSE_SHOWINCLUDES);
447449
}
448450

449-
public CppCompileActionBuilder setOutputs(Artifact outputFile, Artifact dotdFile) {
451+
public boolean serializedDiagnosticsFilesEnabled() {
452+
return featureConfiguration.isEnabled(CppRuleClasses.SERIALIZED_DIAGNOSTICS_FILE);
453+
}
454+
455+
public CppCompileActionBuilder setOutputs(
456+
Artifact outputFile, Artifact dotdFile, Artifact diagnosticsFile) {
450457
this.outputFile = outputFile;
451458
this.dotdFile = dotdFile;
459+
this.diagnosticsFile = diagnosticsFile;
452460
return this;
453461
}
454462

@@ -475,6 +483,16 @@ public CppCompileActionBuilder setOutputs(
475483
} else {
476484
dotdFile = null;
477485
}
486+
if (serializedDiagnosticsFilesEnabled()) {
487+
String diagnosticsFileName =
488+
CppHelper.getDiagnosticsFileName(
489+
ruleErrorConsumer, ccToolchain, outputCategory, outputName);
490+
diagnosticsFile =
491+
CppHelper.getCompileOutputArtifact(
492+
actionConstructionContext, label, diagnosticsFileName, configuration);
493+
} else {
494+
diagnosticsFile = null;
495+
}
478496
return this;
479497
}
480498

@@ -500,6 +518,10 @@ public Artifact getDotdFile() {
500518
return this.dotdFile;
501519
}
502520

521+
public Artifact getDiagnosticsFile() {
522+
return this.diagnosticsFile;
523+
}
524+
503525
public CppCompileActionBuilder setGcnoFile(Artifact gcnoFile) {
504526
this.gcnoFile = gcnoFile;
505527
return this;

src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
4848
private final SpecialArtifact sourceTreeArtifact;
4949
private final SpecialArtifact outputTreeArtifact;
5050
private final SpecialArtifact dotdTreeArtifact;
51+
private final SpecialArtifact diagnosticsTreeArtifact;
5152
private final CcToolchainProvider toolchain;
5253
private final Iterable<ArtifactCategory> categories;
5354
private final ActionOwner actionOwner;
@@ -60,6 +61,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
6061
* @param sourceTreeArtifact the TreeArtifact that contains source files to compile.
6162
* @param outputTreeArtifact the TreeArtifact that contains compilation outputs.
6263
* @param dotdTreeArtifact the TreeArtifact that contains dotd files.
64+
* @param diagnosticsTreeArtifact the TreeArtifact that contains serialized diagnostics files.
6365
* @param cppCompileActionBuilder An almost completely configured {@link CppCompileActionBuilder}
6466
* without the input and output files set. It is used as a template to instantiate expanded
6567
* {CppCompileAction}s.
@@ -72,6 +74,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
7274
SpecialArtifact sourceTreeArtifact,
7375
SpecialArtifact outputTreeArtifact,
7476
SpecialArtifact dotdTreeArtifact,
77+
SpecialArtifact diagnosticsTreeArtifact,
7578
CppCompileActionBuilder cppCompileActionBuilder,
7679
CcToolchainProvider toolchain,
7780
Iterable<ArtifactCategory> categories,
@@ -80,6 +83,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
8083
this.sourceTreeArtifact = sourceTreeArtifact;
8184
this.outputTreeArtifact = outputTreeArtifact;
8285
this.dotdTreeArtifact = dotdTreeArtifact;
86+
this.diagnosticsTreeArtifact = diagnosticsTreeArtifact;
8387
this.toolchain = toolchain;
8488
this.categories = categories;
8589
this.actionOwner = checkNotNull(actionOwner, outputTreeArtifact);
@@ -137,9 +141,19 @@ public ImmutableList<CppCompileAction> generateActionsForInputArtifacts(
137141
TreeFileArtifact.createTemplateExpansionOutput(
138142
dotdTreeArtifact, outputName + ".d", artifactOwner);
139143
}
144+
TreeFileArtifact diagnosticsFileArtifact = null;
145+
if (diagnosticsTreeArtifact != null) {
146+
diagnosticsFileArtifact =
147+
TreeFileArtifact.createTemplateExpansionOutput(
148+
diagnosticsTreeArtifact, outputName + ".dia", artifactOwner);
149+
}
140150
expandedActions.add(
141151
createAction(
142-
inputTreeFileArtifact, outputTreeFileArtifact, dotdFileArtifact, privateHeaders));
152+
inputTreeFileArtifact,
153+
outputTreeFileArtifact,
154+
dotdFileArtifact,
155+
diagnosticsFileArtifact,
156+
privateHeaders));
143157
} catch (EvalException e) {
144158
throw new ActionTemplateExpansionException(e);
145159
}
@@ -160,6 +174,7 @@ protected void computeKey(
160174
cppCompileActionBuilder.getCoptsFilter(),
161175
CppActionNames.CPP_COMPILE,
162176
dotdTreeArtifact,
177+
diagnosticsTreeArtifact,
163178
cppCompileActionBuilder.getFeatureConfiguration(),
164179
cppCompileActionBuilder.getVariables());
165180
CppCompileAction.computeKey(
@@ -190,12 +205,13 @@ private CppCompileAction createAction(
190205
Artifact sourceTreeFileArtifact,
191206
Artifact outputTreeFileArtifact,
192207
@Nullable Artifact dotdFileArtifact,
208+
@Nullable Artifact diagnosticsFileArtifact,
193209
NestedSet<Artifact> privateHeaders)
194210
throws ActionTemplateExpansionException {
195211
CppCompileActionBuilder builder = new CppCompileActionBuilder(cppCompileActionBuilder);
196212
builder.setAdditionalPrunableHeaders(privateHeaders);
197213
builder.setSourceFile(sourceTreeFileArtifact);
198-
builder.setOutputs(outputTreeFileArtifact, dotdFileArtifact);
214+
builder.setOutputs(outputTreeFileArtifact, dotdFileArtifact, diagnosticsFileArtifact);
199215

200216
CcToolchainVariables.Builder buildVariables =
201217
CcToolchainVariables.builder(cppCompileActionBuilder.getVariables());
@@ -210,6 +226,11 @@ private CppCompileAction createAction(
210226
CompileBuildVariables.DEPENDENCY_FILE.getVariableName(),
211227
dotdFileArtifact.getExecPathString());
212228
}
229+
if (diagnosticsFileArtifact != null) {
230+
buildVariables.overrideStringVariable(
231+
CompileBuildVariables.SERIALIZED_DIAGNOSTICS_FILE.getVariableName(),
232+
diagnosticsFileArtifact.getExecPathString());
233+
}
213234

214235
builder.setVariables(buildVariables.build());
215236

0 commit comments

Comments
 (0)