57
57
#include " clang/Basic/TargetOptions.h"
58
58
#include " clang/Driver/Driver.h"
59
59
#include " clang/Frontend/CompilerInstance.h"
60
- #include " clang/Frontend/TextDiagnosticPrinter.h"
61
60
#include " clang/Lex/Preprocessor.h"
62
61
63
62
#include " clang/Lex/PreprocessorOptions.h"
@@ -1575,7 +1574,21 @@ bool ShouldUnique(StringRef arg) {
1575
1574
1576
1575
// static
1577
1576
void SwiftASTContext::AddExtraClangArgs (const std::vector<std::string> &source,
1578
- std::vector<std::string> &dest) {
1577
+ std::vector<std::string> &dest,
1578
+ bool cc1) {
1579
+ // FIXME: Support for cc1 flags isn't complete. The uniquing
1580
+ // algortihm below does not work for cc1 flags. Since cc1 flags are
1581
+ // not stable it's not feasible to keep a list of all multi-arg
1582
+ // flags, for example. It also makes it difficult to correctly
1583
+ // identify where workng directories and path remappings should
1584
+ // applied. For all these reasons, using cc1 flags for anything but
1585
+ // a local build with explicit modules and precise compiler
1586
+ // invocations isn't supported yet.
1587
+ if (cc1) {
1588
+ dest.insert (dest.end (), source.begin (), source.end ());
1589
+ return ;
1590
+ }
1591
+
1579
1592
llvm::StringSet<> unique_flags;
1580
1593
for (auto &arg : dest)
1581
1594
unique_flags.insert (arg);
@@ -1767,14 +1780,8 @@ void SwiftASTContext::AddExtraClangArgs(
1767
1780
eSeverityWarning,
1768
1781
" Mixing and matching of driver and cc1 Clang options detected" );
1769
1782
1770
- // If using direct cc1 flags, compute the arguments and return.
1771
- // Since this is cc1 flags, no driver overwrite can be applied.
1772
- if (importer_options.DirectClangCC1ModuleBuild ) {
1773
- AddExtraClangCC1Args (ExtraArgs, importer_options.ExtraArgs );
1774
- return ;
1775
- }
1776
-
1777
- AddExtraClangArgs (ExtraArgs, importer_options.ExtraArgs );
1783
+ AddExtraClangArgs (ExtraArgs, importer_options.ExtraArgs ,
1784
+ importer_options.DirectClangCC1ModuleBuild );
1778
1785
applyOverrideOptions (importer_options.ExtraArgs , overrideOpts);
1779
1786
if (HasNonexistentExplicitModule (importer_options.ExtraArgs ))
1780
1787
RemoveExplicitModules (importer_options.ExtraArgs );
@@ -1786,73 +1793,6 @@ void SwiftASTContext::AddExtraClangArgs(
1786
1793
});
1787
1794
}
1788
1795
1789
- void SwiftASTContext::AddExtraClangCC1Args (
1790
- const std::vector<std::string> &source, std::vector<std::string> &dest) {
1791
- clang::CompilerInvocation invocation;
1792
- llvm::SmallVector<const char *> clangArgs;
1793
- clangArgs.reserve (source.size ());
1794
- llvm::for_each (source, [&](const std::string &Arg) {
1795
- // Workaround for the extra driver argument embedded in the swiftmodule by
1796
- // some swift compiler version. It always starts with `--target=` and it is
1797
- // not a valid cc1 option.
1798
- if (!StringRef (Arg).starts_with (" --target=" ))
1799
- clangArgs.push_back (Arg.c_str ());
1800
- });
1801
-
1802
- std::string diags;
1803
- llvm::raw_string_ostream os (diags);
1804
- auto diagOpts = llvm::makeIntrusiveRefCnt<clang::DiagnosticOptions>();
1805
- clang::DiagnosticsEngine clangDiags (
1806
- new clang::DiagnosticIDs (), diagOpts,
1807
- new clang::TextDiagnosticPrinter (os, diagOpts.get ()));
1808
-
1809
- if (!clang::CompilerInvocation::CreateFromArgs (invocation, clangArgs,
1810
- clangDiags)) {
1811
- // If cc1 arguments failed to parse, report diagnostics and return
1812
- // immediately.
1813
- AddDiagnostic (eSeverityError, diags);
1814
- // Disable direct-cc1 build as fallback.
1815
- GetClangImporterOptions ().DirectClangCC1ModuleBuild = false ;
1816
- return ;
1817
- }
1818
-
1819
- // Clear module cache key and other CAS options to load modules from disk
1820
- // directly.
1821
- invocation.getFrontendOpts ().ModuleCacheKeys .clear ();
1822
- invocation.getCASOpts () = clang::CASOptions ();
1823
-
1824
- // Remove non-existing modules in a systematic way.
1825
- bool module_missing = false ;
1826
- auto CheckFileExists = [&](const char *file) {
1827
- if (!llvm::sys::fs::exists (file)) {
1828
- std::string m_description;
1829
- HEALTH_LOG_PRINTF (" Nonexistent explicit module file %s" , file);
1830
- module_missing = true ;
1831
- }
1832
- };
1833
- llvm::for_each (invocation.getHeaderSearchOpts ().PrebuiltModuleFiles ,
1834
- [&](const auto &mod) { CheckFileExists (mod.second .c_str ()); });
1835
- llvm::for_each (invocation.getFrontendOpts ().ModuleFiles ,
1836
- [&](const auto &mod) { CheckFileExists (mod.c_str ()); });
1837
-
1838
- // If missing, clear all the prebuilt module options and use implicit module
1839
- // build.
1840
- if (module_missing) {
1841
- invocation.getHeaderSearchOpts ().PrebuiltModuleFiles .clear ();
1842
- invocation.getFrontendOpts ().ModuleFiles .clear ();
1843
- invocation.getLangOpts ().ImplicitModules = true ;
1844
- invocation.getHeaderSearchOpts ().ImplicitModuleMaps = true ;
1845
- }
1846
-
1847
- invocation.generateCC1CommandLine (
1848
- [&](const llvm::Twine &arg) { dest.push_back (arg.str ()); });
1849
-
1850
- // If cc1 arguments are parsed and generated correctly, set explicitly-built
1851
- // module since only explicit module build can use direct cc1 mode.
1852
- m_has_explicit_modules = true ;
1853
- return ;
1854
- }
1855
-
1856
1796
void SwiftASTContext::AddUserClangArgs (TargetProperties &props) {
1857
1797
Args args (props.GetSwiftExtraClangFlags ());
1858
1798
std::vector<std::string> user_clang_flags;
0 commit comments