Skip to content

Commit

Permalink
support C++20 Modules, implement compilation
Browse files Browse the repository at this point in the history
  • Loading branch information
PikachuHyA committed May 20, 2024
1 parent 66eda11 commit 4020a3b
Show file tree
Hide file tree
Showing 4 changed files with 378 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ public final class CcCompilationContext implements CcCompilationContextApi<Artif
private final NestedSet<Artifact> transitiveModules;
private final NestedSet<Artifact> transitivePicModules;

private final NestedSet<Artifact.DerivedArtifact> pcmFiles;
private final NestedSet<Artifact.DerivedArtifact> picPcmFiles;
private final NestedSet<Artifact> modulesInfoFiles;
private final NestedSet<Artifact> picModulesInfoFiles;

private final CppModuleMap cppModuleMap;

private final boolean propagateModuleMapAsActionInput;
Expand Down Expand Up @@ -111,6 +116,10 @@ private CcCompilationContext(
HeaderInfo headerInfo,
NestedSet<Artifact> transitiveModules,
NestedSet<Artifact> transitivePicModules,
NestedSet<Artifact.DerivedArtifact> pcmFiles,
NestedSet<Artifact.DerivedArtifact> picPcmFiles,
NestedSet<Artifact> modulesInfoFiles,
NestedSet<Artifact> picModulesInfoFiles,
ImmutableList<Artifact> directModuleMaps,
ImmutableList<CppModuleMap> exportingModuleMaps,
CppModuleMap cppModuleMap,
Expand All @@ -125,6 +134,10 @@ private CcCompilationContext(
this.headerInfo = headerInfo;
this.transitiveModules = transitiveModules;
this.transitivePicModules = transitivePicModules;
this.pcmFiles = pcmFiles;
this.picPcmFiles = picPcmFiles;
this.modulesInfoFiles = modulesInfoFiles;
this.picModulesInfoFiles = picModulesInfoFiles;
this.cppModuleMap = cppModuleMap;
this.nonCodeInputs = nonCodeInputs;
this.compilationPrerequisites = compilationPrerequisites;
Expand Down Expand Up @@ -550,6 +563,14 @@ public NestedSet<Artifact> getTransitiveModules(boolean usePic) {
return usePic ? transitivePicModules : transitiveModules;
}

public NestedSet<Artifact.DerivedArtifact> getPcmFiles(boolean usePic) {
return usePic ? picPcmFiles: pcmFiles;
}

public NestedSet<Artifact> getModulesInfoFiles(boolean usePic) {
return usePic ? picModulesInfoFiles : modulesInfoFiles;
}

@Override
public Depset getStarlarkTransitiveModules(boolean usePic, StarlarkThread thread)
throws EvalException {
Expand Down Expand Up @@ -627,6 +648,44 @@ ImmutableList<String> getNonTransitiveDefines() {
return commandLineCcCompilationContext.localDefines;
}

public static CcCompilationContext createWithCpp20Modules(
CcCompilationContext ccCompilationContext,
NestedSet<Artifact.DerivedArtifact> pcmFiles,
NestedSet<Artifact.DerivedArtifact> picPcmFiles,
ImmutableList<Artifact> modulesInfoFiles,
ImmutableList<Artifact> picModulesInfoFiles) {
var pcmFilesBuilder = NestedSetBuilder
.fromNestedSet(ccCompilationContext.pcmFiles)
.addTransitive(pcmFiles);
var picPcmFilesBuilder = NestedSetBuilder
.fromNestedSet(ccCompilationContext.picPcmFiles)
.addTransitive(picPcmFiles);
var modulesInfoFilesBuilder = NestedSetBuilder
.fromNestedSet(ccCompilationContext.modulesInfoFiles)
.addAll(modulesInfoFiles);
var picModulesInfoFilesBuilder = NestedSetBuilder
.fromNestedSet(ccCompilationContext.picModulesInfoFiles)
.addAll(picModulesInfoFiles);
return new CcCompilationContext(
ccCompilationContext.commandLineCcCompilationContext,
ccCompilationContext.compilationPrerequisites,
ccCompilationContext.declaredIncludeSrcs,
ccCompilationContext.nonCodeInputs,
ccCompilationContext.headerInfo,
ccCompilationContext.transitiveModules,
ccCompilationContext.transitivePicModules,
pcmFilesBuilder.build(),
picPcmFilesBuilder.build(),
modulesInfoFilesBuilder.build(),
picModulesInfoFilesBuilder.build(),
ccCompilationContext.directModuleMaps,
ccCompilationContext.exportingModuleMaps,
ccCompilationContext.cppModuleMap,
ccCompilationContext.propagateModuleMapAsActionInput,
ccCompilationContext.virtualToOriginalHeaders,
ccCompilationContext.headerTokens);
}

/**
* Returns a {@code CcCompilationContext} that is based on a given {@code CcCompilationContext},
* with {@code extraHeaderTokens} added to the header tokens.
Expand All @@ -644,6 +703,10 @@ public static CcCompilationContext createWithExtraHeaderTokens(
ccCompilationContext.headerInfo,
ccCompilationContext.transitiveModules,
ccCompilationContext.transitivePicModules,
ccCompilationContext.pcmFiles,
ccCompilationContext.picPcmFiles,
ccCompilationContext.modulesInfoFiles,
ccCompilationContext.picModulesInfoFiles,
ccCompilationContext.directModuleMaps,
ccCompilationContext.exportingModuleMaps,
ccCompilationContext.cppModuleMap,
Expand Down Expand Up @@ -765,6 +828,10 @@ private void mergeDependentCcCompilationContext(
TransitiveSetHelper<String> allDefines,
NestedSetBuilder<Artifact> transitiveModules,
NestedSetBuilder<Artifact> transitivePicModules,
NestedSetBuilder<Artifact.DerivedArtifact> pcmFiles,
NestedSetBuilder<Artifact.DerivedArtifact> picPcmFiles,
NestedSetBuilder<Artifact> modulesInfoFiles,
NestedSetBuilder<Artifact> picModulesInfoFiles,
Set<Artifact> directModuleMaps) {
Preconditions.checkNotNull(otherCcCompilationContext);
compilationPrerequisites.addTransitive(
Expand All @@ -785,6 +852,11 @@ private void mergeDependentCcCompilationContext(
addIfNotNull(transitivePicModules, otherCcCompilationContext.headerInfo.picHeaderModule);
addIfNotNull(transitivePicModules, otherCcCompilationContext.headerInfo.separatePicModule);

pcmFiles.addTransitive(otherCcCompilationContext.pcmFiles);
picPcmFiles.addTransitive(otherCcCompilationContext.picPcmFiles);
modulesInfoFiles.addTransitive(otherCcCompilationContext.modulesInfoFiles);
picModulesInfoFiles.addTransitive(otherCcCompilationContext.picModulesInfoFiles);

nonCodeInputs.addTransitive(otherCcCompilationContext.nonCodeInputs);

// All module maps of direct dependencies are inputs to the current compile independently of
Expand Down Expand Up @@ -842,6 +914,10 @@ private void mergeDependentCcCompilationContexts(
TransitiveSetHelper<String> allDefines,
NestedSetBuilder<Artifact> transitiveModules,
NestedSetBuilder<Artifact> transitivePicModules,
NestedSetBuilder<Artifact.DerivedArtifact> pcmFiles,
NestedSetBuilder<Artifact.DerivedArtifact> picPcmFiles,
NestedSetBuilder<Artifact> modulesInfoFiles,
NestedSetBuilder<Artifact> picModulesInfoFiles,
Set<Artifact> directModuleMaps,
Set<CppModuleMap> exportingModuleMaps) {
for (CcCompilationContext ccCompilationContext :
Expand All @@ -851,6 +927,10 @@ private void mergeDependentCcCompilationContexts(
allDefines,
transitiveModules,
transitivePicModules,
pcmFiles,
picPcmFiles,
modulesInfoFiles,
picModulesInfoFiles,
directModuleMaps);
}

Expand Down Expand Up @@ -1079,6 +1159,10 @@ public CcCompilationContext build() {
TransitiveSetHelper<String> allDefines = new TransitiveSetHelper<>();
NestedSetBuilder<Artifact> transitiveModules = NestedSetBuilder.stableOrder();
NestedSetBuilder<Artifact> transitivePicModules = NestedSetBuilder.stableOrder();
NestedSetBuilder<Artifact.DerivedArtifact> pcmFiles = NestedSetBuilder.stableOrder();
NestedSetBuilder<Artifact.DerivedArtifact> picPcmFiles = NestedSetBuilder.stableOrder();
NestedSetBuilder<Artifact> modulesInfoFiles = NestedSetBuilder.stableOrder();
NestedSetBuilder<Artifact> picModulesInfoFiles = NestedSetBuilder.stableOrder();
Set<Artifact> directModuleMaps = new LinkedHashSet<>();
Set<CppModuleMap> exportingModuleMaps = new LinkedHashSet<>();
mergeDependentCcCompilationContexts(
Expand All @@ -1087,6 +1171,10 @@ public CcCompilationContext build() {
allDefines,
transitiveModules,
transitivePicModules,
pcmFiles,
picPcmFiles,
modulesInfoFiles,
picModulesInfoFiles,
directModuleMaps,
exportingModuleMaps);

Expand All @@ -1110,6 +1198,10 @@ public CcCompilationContext build() {
headerInfo,
transitiveModules.build(),
transitivePicModules.build(),
pcmFiles.build(),
picPcmFiles.build(),
modulesInfoFiles.build(),
picModulesInfoFiles.build(),
ImmutableList.copyOf(directModuleMaps),
ImmutableList.copyOf(exportingModuleMaps),
cppModuleMap,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ public class CcCompilationOutputs implements CcCompilationOutputsApi<Artifact> {
*/
private final ImmutableList<Artifact> picObjectFiles;

/**
* All .pcm files built by the target.
*/
private final NestedSet<Artifact.DerivedArtifact> pcmFiles;

/**
* All .pic.pcm files built by the target.
*/
private final NestedSet<Artifact.DerivedArtifact> picPcmFiles;

private final ImmutableList<Artifact> modulesInfoFiles;
private final ImmutableList<Artifact> picModulesInfoFiles;
/**
* Maps all .o bitcode files coming from a ThinLTO C(++) compilation under our control to
* information needed by the LTO indexing and backend steps.
Expand Down Expand Up @@ -82,6 +94,10 @@ public class CcCompilationOutputs implements CcCompilationOutputsApi<Artifact> {
private CcCompilationOutputs(
ImmutableList<Artifact> objectFiles,
ImmutableList<Artifact> picObjectFiles,
NestedSet<Artifact.DerivedArtifact> pcmFiles,
NestedSet<Artifact.DerivedArtifact> picPcmFiles,
ImmutableList<Artifact> modulesInfoFiles,
ImmutableList<Artifact> picModulesInfoFiles,
LtoCompilationContext ltoCompilationContext,
ImmutableList<Artifact> dwoFiles,
ImmutableList<Artifact> picDwoFiles,
Expand All @@ -92,6 +108,10 @@ private CcCompilationOutputs(
ImmutableList<Artifact> moduleFiles) {
this.objectFiles = objectFiles;
this.picObjectFiles = picObjectFiles;
this.pcmFiles = pcmFiles;
this.picPcmFiles = picPcmFiles;
this.modulesInfoFiles = modulesInfoFiles;
this.picModulesInfoFiles = picModulesInfoFiles;
this.ltoCompilationContext = ltoCompilationContext;
this.dwoFiles = dwoFiles;
this.picDwoFiles = picDwoFiles;
Expand All @@ -111,6 +131,19 @@ public ImmutableList<Artifact> getObjectFiles(boolean usePic) {
return usePic ? picObjectFiles : objectFiles;
}

/**
* Returns an unmodifiable view of the .pcm or .pic.pcm files set.
*
* @param usePic whether to return .pic.pcm files
*/
public NestedSet<Artifact.DerivedArtifact> getPcmFiles(boolean usePic) {
return usePic ? picPcmFiles : pcmFiles;
}

public ImmutableList<Artifact> getModulesInfoFiles(boolean usePic) {
return usePic ? picModulesInfoFiles : modulesInfoFiles;
}

@Override
public Sequence<Artifact> getStarlarkObjects() throws EvalException {
return StarlarkList.immutableCopyOf(getObjectFiles(/* usePic= */ false));
Expand Down Expand Up @@ -244,6 +277,10 @@ public static Builder builder() {
public static final class Builder {
private final Set<Artifact> objectFiles = new LinkedHashSet<>();
private final Set<Artifact> picObjectFiles = new LinkedHashSet<>();
private final NestedSetBuilder<Artifact.DerivedArtifact> pcmFiles = NestedSetBuilder.stableOrder();
private final NestedSetBuilder<Artifact.DerivedArtifact> picPcmFiles = NestedSetBuilder.stableOrder();
private final Set<Artifact> modulesInfoFiles = new LinkedHashSet<>();
private final Set<Artifact> picModulesInfoFiles = new LinkedHashSet<>();
private final LtoCompilationContext.Builder ltoCompilationContext =
new LtoCompilationContext.Builder();
private final Set<Artifact> dwoFiles = new LinkedHashSet<>();
Expand All @@ -262,6 +299,10 @@ public CcCompilationOutputs build() {
return new CcCompilationOutputs(
ImmutableList.copyOf(objectFiles),
ImmutableList.copyOf(picObjectFiles),
pcmFiles.build(),
picPcmFiles.build(),
ImmutableList.copyOf(modulesInfoFiles),
ImmutableList.copyOf(picModulesInfoFiles),
ltoCompilationContext.build(),
ImmutableList.copyOf(dwoFiles),
ImmutableList.copyOf(picDwoFiles),
Expand All @@ -276,6 +317,10 @@ public CcCompilationOutputs build() {
public Builder merge(CcCompilationOutputs outputs) {
this.objectFiles.addAll(outputs.objectFiles);
this.picObjectFiles.addAll(outputs.picObjectFiles);
this.pcmFiles.addTransitive(outputs.pcmFiles);
this.picPcmFiles.addTransitive(outputs.picPcmFiles);
this.modulesInfoFiles.addAll(outputs.modulesInfoFiles);
this.picModulesInfoFiles.addAll(outputs.picModulesInfoFiles);
this.dwoFiles.addAll(outputs.dwoFiles);
this.picDwoFiles.addAll(outputs.picDwoFiles);
this.gcnoFiles.addAll(outputs.gcnoFiles);
Expand All @@ -298,6 +343,20 @@ public Builder addObjectFile(Artifact artifact) {
return this;
}

/** Adds a pcm file. */
@CanIgnoreReturnValue
public Builder addPcmFile(Artifact.DerivedArtifact artifact) {
pcmFiles.add(artifact);
return this;
}

/** Adds a modules info file. */
@CanIgnoreReturnValue
public Builder addModulesInfoFile(Artifact artifact) {
modulesInfoFiles.add(artifact);
return this;
}

@CanIgnoreReturnValue
public Builder addObjectFiles(Iterable<Artifact> artifacts) {
for (Artifact artifact : artifacts) {
Expand All @@ -315,6 +374,19 @@ public Builder addPicObjectFile(Artifact artifact) {
return this;
}

/** Adds a pic pcm file. */
@CanIgnoreReturnValue
public Builder addPicPcmFile(Artifact.DerivedArtifact artifact) {
picPcmFiles.add(artifact);
return this;
}
/** Adds a pic modules info file. */
@CanIgnoreReturnValue
public Builder addPicModulesInfoFile(Artifact artifact) {
picModulesInfoFiles.add(artifact);
return this;
}

@CanIgnoreReturnValue
public Builder addLtoBitcodeFile(
Artifact fullBitcode, Artifact ltoIndexingBitcode, ImmutableList<String> copts) {
Expand Down
Loading

0 comments on commit 4020a3b

Please sign in to comment.