Skip to content

Commit c8ea368

Browse files
brentleyjonescopybara-github
authored andcommitted
Add feature to produce serialized diagnostics files
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. Closes bazelbuild#15191. Closes bazelbuild#15403. PiperOrigin-RevId: 452024270 Change-Id: I8d28e6ceb729d90c3200ddd2ba96cdb09ac14afc
1 parent 3649324 commit c8ea368

File tree

15 files changed

+253
-9
lines changed

15 files changed

+253
-9
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum ArtifactCategory {
2727
INTERFACE_LIBRARY("lib", ".ifso", ".tbd", ".if.lib", ".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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,8 +1552,8 @@ private Artifact createCompileActionTemplate(
15521552
SpecialArtifact outputFiles =
15531553
CppHelper.getCompileOutputTreeArtifact(
15541554
actionConstructionContext, label, sourceArtifact, outputName, usePic);
1555-
// Dotd file output is specified in the execution phase.
1556-
builder.setOutputs(outputFiles, /* dotdFile= */ null);
1555+
// Dotd and dia file outputs are specified in the execution phase.
1556+
builder.setOutputs(outputFiles, /* dotdFile= */ null, /* diagnosticsFile= */ null);
15571557
builder.setVariables(
15581558
setupCompileBuildVariables(
15591559
builder,
@@ -1575,11 +1575,18 @@ private Artifact createCompileActionTemplate(
15751575
CppHelper.getDotdOutputTreeArtifact(
15761576
actionConstructionContext, label, sourceArtifact, outputName, usePic);
15771577
}
1578+
SpecialArtifact diagnosticsTreeArtifact = null;
1579+
if (builder.serializedDiagnosticsFilesEnabled()) {
1580+
diagnosticsTreeArtifact =
1581+
CppHelper.getDiagnosticsOutputTreeArtifact(
1582+
actionConstructionContext, label, sourceArtifact, outputName, usePic);
1583+
}
15781584
CppCompileActionTemplate actionTemplate =
15791585
new CppCompileActionTemplate(
15801586
sourceArtifact,
15811587
outputFiles,
15821588
dotdTreeArtifact,
1589+
diagnosticsTreeArtifact,
15831590
builder,
15841591
ccToolchain,
15851592
outputCategories,
@@ -1639,6 +1646,10 @@ private CcToolchainVariables setupCompileBuildVariables(
16391646
if (builder.getDotdFile() != null) {
16401647
dotdFileExecPath = builder.getDotdFile().getExecPathString();
16411648
}
1649+
String diagnosticsFileExecPath = null;
1650+
if (builder.getDiagnosticsFile() != null) {
1651+
diagnosticsFileExecPath = builder.getDiagnosticsFile().getExecPathString();
1652+
}
16421653
if (needsFdoBuildVariables && fdoContext.hasArtifacts(cppConfiguration)) {
16431654
// This modifies the passed-in builder, which is a surprising side-effect, and makes it unsafe
16441655
// to call this method multiple times for the same builder.
@@ -1714,6 +1725,7 @@ private CcToolchainVariables setupCompileBuildVariables(
17141725
/* thinLtoOutputObjectFile= */ null,
17151726
getCopts(builder.getSourceFile(), sourceLabel),
17161727
dotdFileExecPath,
1728+
diagnosticsFileExecPath,
17171729
usePic,
17181730
ccCompilationContext.getExternalIncludeDirs(),
17191731
additionalBuildVariables);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ public CcToolchainVariables getCompileBuildVariables(
320320
usePic,
321321
/* fdoStamp= */ null,
322322
/* dotdFileExecPath= */ null,
323+
/* diagnosticsFileExecPath= */ null,
323324
variablesExtensions,
324325
/* additionalBuildVariables= */ ImmutableMap.of(),
325326
/* directModuleMaps= */ ImmutableList.of(),

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

Lines changed: 15 additions & 0 deletions
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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
225225
* not needed during actual execution.
226226
* @param outputFile the object file that is written as result of the compilation
227227
* @param dotdFile the .d file that is generated as a side-effect of compilation
228+
* @param diagnosticsFile the .dia file that is generated as a side-effect of compilation
228229
* @param gcnoFile the coverage notes that are written in coverage mode, can be null
229230
* @param dwoFile the .dwo output file where debug information is stored for Fission builds (null
230231
* if Fission mode is disabled)
@@ -253,6 +254,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
253254
NestedSet<Artifact> additionalPrunableHeaders,
254255
Artifact outputFile,
255256
@Nullable Artifact dotdFile,
257+
@Nullable Artifact diagnosticsFile,
256258
@Nullable Artifact gcnoFile,
257259
@Nullable Artifact dwoFile,
258260
@Nullable Artifact ltoIndexingFile,
@@ -272,7 +274,14 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
272274
NestedSetBuilder.fromNestedSet(mandatoryInputs)
273275
.addTransitive(inputsForInvalidation)
274276
.build(),
275-
collectOutputs(outputFile, dotdFile, gcnoFile, dwoFile, ltoIndexingFile, additionalOutputs),
277+
collectOutputs(
278+
outputFile,
279+
dotdFile,
280+
diagnosticsFile,
281+
gcnoFile,
282+
dwoFile,
283+
ltoIndexingFile,
284+
additionalOutputs),
276285
env);
277286
Preconditions.checkNotNull(outputFile);
278287
this.outputFile = outputFile;
@@ -293,7 +302,13 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
293302
Preconditions.checkNotNull(additionalIncludeScanningRoots);
294303
this.compileCommandLine =
295304
buildCommandLine(
296-
sourceFile, coptsFilter, actionName, dotdFile, featureConfiguration, variables);
305+
sourceFile,
306+
coptsFilter,
307+
actionName,
308+
dotdFile,
309+
diagnosticsFile,
310+
featureConfiguration,
311+
variables);
297312
this.executionInfo = executionInfo;
298313
this.actionName = actionName;
299314
this.featureConfiguration = featureConfiguration;
@@ -317,6 +332,7 @@ public class CppCompileAction extends AbstractAction implements IncludeScannable
317332
private static ImmutableSet<Artifact> collectOutputs(
318333
@Nullable Artifact outputFile,
319334
@Nullable Artifact dotdFile,
335+
@Nullable Artifact diagnosticsFile,
320336
@Nullable Artifact gcnoFile,
321337
@Nullable Artifact dwoFile,
322338
@Nullable Artifact ltoIndexingFile,
@@ -333,6 +349,9 @@ private static ImmutableSet<Artifact> collectOutputs(
333349
if (dotdFile != null) {
334350
outputs.add(dotdFile);
335351
}
352+
if (diagnosticsFile != null) {
353+
outputs.add(diagnosticsFile);
354+
}
336355
if (dwoFile != null) {
337356
outputs.add(dwoFile);
338357
}
@@ -347,6 +366,7 @@ static CompileCommandLine buildCommandLine(
347366
CoptsFilter coptsFilter,
348367
String actionName,
349368
Artifact dotdFile,
369+
Artifact diagnosticsFile,
350370
FeatureConfiguration featureConfiguration,
351371
CcToolchainVariables variables) {
352372
return CompileCommandLine.builder(sourceFile, coptsFilter, actionName, dotdFile)

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

Lines changed: 22 additions & 1 deletion
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<>();
@@ -306,6 +307,7 @@ public CppCompileAction buildAndVerify() throws UnconfiguredActionConfigExceptio
306307
prunableHeaders,
307308
outputFile,
308309
dotdFile,
310+
diagnosticsFile,
309311
gcnoFile,
310312
dwoFile,
311313
ltoIndexingFile,
@@ -465,9 +467,15 @@ public boolean dotdFilesEnabled() {
465467
&& !featureConfiguration.isEnabled(CppRuleClasses.PARSE_SHOWINCLUDES);
466468
}
467469

468-
public CppCompileActionBuilder setOutputs(Artifact outputFile, Artifact dotdFile) {
470+
public boolean serializedDiagnosticsFilesEnabled() {
471+
return featureConfiguration.isEnabled(CppRuleClasses.SERIALIZED_DIAGNOSTICS_FILE);
472+
}
473+
474+
public CppCompileActionBuilder setOutputs(
475+
Artifact outputFile, Artifact dotdFile, Artifact diagnosticsFile) {
469476
this.outputFile = outputFile;
470477
this.dotdFile = dotdFile;
478+
this.diagnosticsFile = diagnosticsFile;
471479
return this;
472480
}
473481

@@ -492,6 +500,15 @@ public CppCompileActionBuilder setOutputs(
492500
} else {
493501
dotdFile = null;
494502
}
503+
if (serializedDiagnosticsFilesEnabled()) {
504+
String diagnosticsFileName =
505+
CppHelper.getDiagnosticsFileName(ccToolchain, outputCategory, outputName);
506+
diagnosticsFile =
507+
CppHelper.getCompileOutputArtifact(
508+
actionConstructionContext, label, diagnosticsFileName, configuration);
509+
} else {
510+
diagnosticsFile = null;
511+
}
495512
return this;
496513
}
497514

@@ -517,6 +534,10 @@ public Artifact getDotdFile() {
517534
return this.dotdFile;
518535
}
519536

537+
public Artifact getDiagnosticsFile() {
538+
return this.diagnosticsFile;
539+
}
540+
520541
public CppCompileActionBuilder setGcnoFile(Artifact gcnoFile) {
521542
this.gcnoFile = gcnoFile;
522543
return this;

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
4747
private final SpecialArtifact sourceTreeArtifact;
4848
private final SpecialArtifact outputTreeArtifact;
4949
private final SpecialArtifact dotdTreeArtifact;
50+
private final SpecialArtifact diagnosticsTreeArtifact;
5051
private final CcToolchainProvider toolchain;
5152
private final ImmutableList<ArtifactCategory> categories;
5253
private final ActionOwner actionOwner;
@@ -59,6 +60,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
5960
* @param sourceTreeArtifact the TreeArtifact that contains source files to compile.
6061
* @param outputTreeArtifact the TreeArtifact that contains compilation outputs.
6162
* @param dotdTreeArtifact the TreeArtifact that contains dotd files.
63+
* @param diagnosticsTreeArtifact the TreeArtifact that contains serialized diagnostics files.
6264
* @param cppCompileActionBuilder An almost completely configured {@link CppCompileActionBuilder}
6365
* without the input and output files set. It is used as a template to instantiate expanded
6466
* {CppCompileAction}s.
@@ -71,6 +73,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
7173
SpecialArtifact sourceTreeArtifact,
7274
SpecialArtifact outputTreeArtifact,
7375
SpecialArtifact dotdTreeArtifact,
76+
SpecialArtifact diagnosticsTreeArtifact,
7477
CppCompileActionBuilder cppCompileActionBuilder,
7578
CcToolchainProvider toolchain,
7679
ImmutableList<ArtifactCategory> categories,
@@ -79,6 +82,7 @@ public final class CppCompileActionTemplate extends ActionKeyCacher
7982
this.sourceTreeArtifact = sourceTreeArtifact;
8083
this.outputTreeArtifact = outputTreeArtifact;
8184
this.dotdTreeArtifact = dotdTreeArtifact;
85+
this.diagnosticsTreeArtifact = diagnosticsTreeArtifact;
8286
this.toolchain = toolchain;
8387
this.categories = categories;
8488
this.actionOwner = checkNotNull(actionOwner, outputTreeArtifact);
@@ -136,9 +140,19 @@ public ImmutableList<CppCompileAction> generateActionsForInputArtifacts(
136140
TreeFileArtifact.createTemplateExpansionOutput(
137141
dotdTreeArtifact, outputName + ".d", artifactOwner);
138142
}
143+
TreeFileArtifact diagnosticsFileArtifact = null;
144+
if (diagnosticsTreeArtifact != null) {
145+
diagnosticsFileArtifact =
146+
TreeFileArtifact.createTemplateExpansionOutput(
147+
diagnosticsTreeArtifact, outputName + ".dia", artifactOwner);
148+
}
139149
expandedActions.add(
140150
createAction(
141-
inputTreeFileArtifact, outputTreeFileArtifact, dotdFileArtifact, privateHeaders));
151+
inputTreeFileArtifact,
152+
outputTreeFileArtifact,
153+
dotdFileArtifact,
154+
diagnosticsFileArtifact,
155+
privateHeaders));
142156
}
143157

144158
return expandedActions.build();
@@ -156,6 +170,7 @@ protected void computeKey(
156170
cppCompileActionBuilder.getCoptsFilter(),
157171
CppActionNames.CPP_COMPILE,
158172
dotdTreeArtifact,
173+
diagnosticsTreeArtifact,
159174
cppCompileActionBuilder.getFeatureConfiguration(),
160175
cppCompileActionBuilder.getVariables());
161176
CppCompileAction.computeKey(
@@ -186,13 +201,14 @@ private CppCompileAction createAction(
186201
TreeFileArtifact sourceTreeFileArtifact,
187202
TreeFileArtifact outputTreeFileArtifact,
188203
@Nullable Artifact dotdFileArtifact,
204+
@Nullable Artifact diagnosticsFileArtifact,
189205
NestedSet<Artifact> privateHeaders)
190206
throws ActionExecutionException {
191207
CppCompileActionBuilder builder =
192208
new CppCompileActionBuilder(cppCompileActionBuilder)
193209
.setAdditionalPrunableHeaders(privateHeaders)
194210
.setSourceFile(sourceTreeFileArtifact)
195-
.setOutputs(outputTreeFileArtifact, dotdFileArtifact);
211+
.setOutputs(outputTreeFileArtifact, dotdFileArtifact, diagnosticsFileArtifact);
196212

197213
CcToolchainVariables.Builder buildVariables =
198214
CcToolchainVariables.builder(cppCompileActionBuilder.getVariables());
@@ -207,6 +223,11 @@ private CppCompileAction createAction(
207223
CompileBuildVariables.DEPENDENCY_FILE.getVariableName(),
208224
dotdFileArtifact.getExecPathString());
209225
}
226+
if (diagnosticsFileArtifact != null) {
227+
buildVariables.overrideStringVariable(
228+
CompileBuildVariables.SERIALIZED_DIAGNOSTICS_FILE.getVariableName(),
229+
diagnosticsFileArtifact.getExecPathString());
230+
}
210231

211232
builder.setVariables(buildVariables.build());
212233

0 commit comments

Comments
 (0)