Skip to content

Commit 244ec57

Browse files
committed
[Bridging PCH] Add ClangImporter::emitBridgingPCH.
1 parent 6368857 commit 244ec57

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

include/swift/ClangImporter/ClangImporter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ class ClangImporter final : public ClangModuleLoader {
218218
std::string getBridgingHeaderContents(StringRef headerPath, off_t &fileSize,
219219
time_t &fileModTime);
220220

221+
/// Makes a temporary replica of the ClangImporter's CompilerInstance, reads
222+
/// an Objective-C header file into the replica and emits a PCH file of its
223+
/// content. Delegates to clang for everything except construction of the
224+
/// replica.
225+
///
226+
/// \sa clang::GeneratePCHAction
227+
bool emitBridgingPCH(StringRef headerPath, StringRef outputPCHPath);
228+
221229
const clang::Module *getClangOwningModule(ClangNode Node) const;
222230
bool hasTypedef(const clang::Decl *typeDecl) const;
223231

lib/ClangImporter/ClangImporter.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,41 @@ std::string ClangImporter::getBridgingHeaderContents(StringRef headerPath,
994994
return result;
995995
}
996996

997+
bool
998+
ClangImporter::emitBridgingPCH(StringRef headerPath,
999+
StringRef outputPCHPath) {
1000+
llvm::IntrusiveRefCntPtr<clang::CompilerInvocation> invocation{
1001+
new clang::CompilerInvocation(*Impl.Invocation)
1002+
};
1003+
invocation->getFrontendOpts().DisableFree = false;
1004+
invocation->getFrontendOpts().Inputs.clear();
1005+
invocation->getFrontendOpts().Inputs.push_back(
1006+
clang::FrontendInputFile(headerPath, clang::IK_ObjC));
1007+
invocation->getFrontendOpts().OutputFile = outputPCHPath;
1008+
invocation->getPreprocessorOpts().resetNonModularOptions();
1009+
1010+
clang::CompilerInstance emitInstance(
1011+
Impl.Instance->getPCHContainerOperations());
1012+
emitInstance.setInvocation(&*invocation);
1013+
emitInstance.createDiagnostics(&Impl.Instance->getDiagnosticClient(),
1014+
false);
1015+
1016+
clang::FileManager &fileManager = Impl.Instance->getFileManager();
1017+
emitInstance.setFileManager(&fileManager);
1018+
emitInstance.createSourceManager(fileManager);
1019+
emitInstance.setTarget(&Impl.Instance->getTarget());
1020+
1021+
clang::GeneratePCHAction action;
1022+
emitInstance.ExecuteAction(action);
1023+
if (emitInstance.getDiagnostics().hasErrorOccurred()) {
1024+
Impl.SwiftContext.Diags.diagnose({},
1025+
diag::bridging_header_pch_error,
1026+
outputPCHPath, headerPath);
1027+
return true;
1028+
}
1029+
return false;
1030+
}
1031+
9971032
void ClangImporter::collectSubModuleNames(
9981033
ArrayRef<std::pair<Identifier, SourceLoc>> path,
9991034
std::vector<std::string> &names) {

0 commit comments

Comments
 (0)