diff options
author | Yuriy Syrovetskiy <cblp@cblp.su> | 2019-04-02 12:59:49 +0300 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-04-08 14:41:51 -0400 |
commit | 97502be8bda9199ac058b9677b4b6ba028022936 (patch) | |
tree | 36ed855bd07d08f4127c45265d5e4f27ea8dbcac /compiler | |
parent | 2b3f4718502465e2b4dfa4a7868ed7a3ad5e4ff1 (diff) | |
download | haskell-97502be8bda9199ac058b9677b4b6ba028022936.tar.gz |
Add `-optcxx` option (#16477)
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/main/DriverPhases.hs | 1 | ||||
-rw-r--r-- | compiler/main/DriverPipeline.hs | 15 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 11 | ||||
-rw-r--r-- | compiler/main/HscTypes.hs | 14 | ||||
-rw-r--r-- | compiler/main/SysTools.hs | 1 | ||||
-rw-r--r-- | compiler/main/SysTools/ExtraObj.hs | 2 | ||||
-rw-r--r-- | compiler/main/SysTools/Tasks.hs | 25 |
7 files changed, 49 insertions, 20 deletions
diff --git a/compiler/main/DriverPhases.hs b/compiler/main/DriverPhases.hs index 12e12ca321..d4392c4c37 100644 --- a/compiler/main/DriverPhases.hs +++ b/compiler/main/DriverPhases.hs @@ -369,4 +369,3 @@ isHaskellSigFilename f = isHaskellSigSuffix (drop 1 $ takeExtension f) isObjectFilename, isDynLibFilename :: Platform -> FilePath -> Bool isObjectFilename platform f = isObjectSuffix platform (drop 1 $ takeExtension f) isDynLibFilename platform f = isDynLibSuffix platform (drop 1 $ takeExtension f) - diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index 458a118912..83e6bfde59 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -1218,17 +1218,8 @@ runPhase (RealPhase cc_phase) input_fn dflags ghcVersionH <- liftIO $ getGhcVersionPathName dflags - let gcc_lang_opt | cc_phase `eqPhase` Ccxx = "c++" - | cc_phase `eqPhase` Cobjc = "objective-c" - | cc_phase `eqPhase` Cobjcxx = "objective-c++" - | otherwise = "c" - liftIO $ SysTools.runCc dflags ( - -- force the C compiler to interpret this file as C when - -- compiling .hc files, by adding the -x c option. - -- Also useful for plain .c files, just in case GHC saw a - -- -x c option. - [ SysTools.Option "-x", SysTools.Option gcc_lang_opt - , SysTools.FileOption "" input_fn + liftIO $ SysTools.runCc (phaseForeignLanguage cc_phase) dflags ( + [ SysTools.FileOption "" input_fn , SysTools.Option "-o" , SysTools.FileOption "" output_fn ] @@ -1917,7 +1908,7 @@ doCpp dflags raw input_fn output_fn = do let verbFlags = getVerbFlags dflags let cpp_prog args | raw = SysTools.runCpp dflags args - | otherwise = SysTools.runCc dflags (SysTools.Option "-E" : args) + | otherwise = SysTools.runCc Nothing dflags (SysTools.Option "-E" : args) let target_defs = [ "-D" ++ HOST_OS ++ "_BUILD_OS", diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 0783189aaf..66a5335db6 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -92,7 +92,8 @@ module DynFlags ( extraGccViaCFlags, systemPackageConfig, pgm_L, pgm_P, pgm_F, pgm_c, pgm_a, pgm_l, pgm_dll, pgm_T, pgm_windres, pgm_libtool, pgm_ar, pgm_ranlib, pgm_lo, pgm_lc, - pgm_lcc, pgm_i, opt_L, opt_P, opt_F, opt_c, opt_a, opt_l, opt_i, + pgm_lcc, pgm_i, + opt_L, opt_P, opt_F, opt_c, opt_cxx, opt_a, opt_l, opt_i, opt_P_signature, opt_windres, opt_lo, opt_lc, opt_lcc, @@ -1340,6 +1341,7 @@ data Settings = Settings { -- See Note [Repeated -optP hashing] sOpt_F :: [String], sOpt_c :: [String], + sOpt_cxx :: [String], sOpt_a :: [String], sOpt_l :: [String], sOpt_windres :: [String], @@ -1423,6 +1425,8 @@ opt_F dflags = sOpt_F (settings dflags) opt_c :: DynFlags -> [String] opt_c dflags = concatMap (wayOptc (targetPlatform dflags)) (ways dflags) ++ sOpt_c (settings dflags) +opt_cxx :: DynFlags -> [String] +opt_cxx dflags = sOpt_cxx (settings dflags) opt_a :: DynFlags -> [String] opt_a dflags = sOpt_a (settings dflags) opt_l :: DynFlags -> [String] @@ -2520,7 +2524,7 @@ setObjectDir, setHiDir, setHieDir, setStubDir, setDumpDir, setOutputDir, setDynObjectSuf, setDynHiSuf, setDylibInstallName, setObjectSuf, setHiSuf, setHieSuf, setHcSuf, parseDynLibLoaderMode, - setPgmP, addOptl, addOptc, addOptP, + setPgmP, addOptl, addOptc, addOptcxx, addOptP, addCmdlineFramework, addHaddockOpts, addGhciScript, setInteractivePrint :: String -> DynFlags -> DynFlags @@ -2636,6 +2640,7 @@ setDumpPrefixForce f d = d { dumpPrefixForce = f} setPgmP f = let (pgm:args) = words f in alterSettings (\s -> s { sPgm_P = (pgm, map Option args)}) addOptl f = alterSettings (\s -> s { sOpt_l = f : sOpt_l s}) addOptc f = alterSettings (\s -> s { sOpt_c = f : sOpt_c s}) +addOptcxx f = alterSettings (\s -> s { sOpt_cxx = f : sOpt_cxx s}) addOptP f = alterSettings (\s -> s { sOpt_P = f : sOpt_P s , sOpt_P_fingerprint = fingerprintStrings (f : sOpt_P s) }) @@ -3038,6 +3043,8 @@ dynamic_flags_deps = [ (hasArg (\f -> alterSettings (\s -> s { sOpt_F = f : sOpt_F s}))) , make_ord_flag defFlag "optc" (hasArg addOptc) + , make_ord_flag defFlag "optcxx" + (hasArg addOptcxx) , make_ord_flag defFlag "opta" (hasArg (\f -> alterSettings (\s -> s { sOpt_a = f : sOpt_a s}))) , make_ord_flag defFlag "optl" diff --git a/compiler/main/HscTypes.hs b/compiler/main/HscTypes.hs index 6772668420..f4306f3d16 100644 --- a/compiler/main/HscTypes.hs +++ b/compiler/main/HscTypes.hs @@ -30,6 +30,7 @@ module HscTypes ( ModGuts(..), CgGuts(..), ForeignStubs(..), appendStubC, ImportedMods, ImportedBy(..), importedByUser, ImportedModsVal(..), SptEntry(..), ForeignSrcLang(..), + phaseForeignLanguage, ModSummary(..), ms_imps, ms_installed_mod, ms_mod_name, showModMsg, isBootSummary, msHsFilePath, msHiFilePath, msObjFilePath, @@ -182,6 +183,7 @@ import CmdLineParser import DynFlags import DriverPhases ( Phase, HscSource(..), hscSourceString , isHsBootOrSig, isHsigFile ) +import qualified DriverPhases as Phase import BasicTypes import IfaceSyn import Maybes @@ -3136,3 +3138,15 @@ Also see Note [Typechecking Complete Matches] in TcBinds for a more detailed explanation for how GHC ensures that all the conlikes in a COMPLETE set are consistent. -} + +-- | Foreign language of the phase if the phase deals with a foreign code +phaseForeignLanguage :: Phase -> Maybe ForeignSrcLang +phaseForeignLanguage phase = case phase of + Phase.Cc -> Just LangC + Phase.Ccxx -> Just LangCxx + Phase.Cobjc -> Just LangObjc + Phase.Cobjcxx -> Just LangObjcxx + Phase.HCc -> Just LangC + Phase.As _ -> Just LangAsm + Phase.MergeForeign -> Just RawObject + _ -> Nothing diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs index fddc4ac30f..ca30e4aae3 100644 --- a/compiler/main/SysTools.hs +++ b/compiler/main/SysTools.hs @@ -301,6 +301,7 @@ initSysTools top_dir sOpt_P_fingerprint = fingerprint0, sOpt_F = [], sOpt_c = [], + sOpt_cxx = [], sOpt_a = [], sOpt_l = [], sOpt_windres = [], diff --git a/compiler/main/SysTools/ExtraObj.hs b/compiler/main/SysTools/ExtraObj.hs index 774884a0d7..149d3a678a 100644 --- a/compiler/main/SysTools/ExtraObj.hs +++ b/compiler/main/SysTools/ExtraObj.hs @@ -40,7 +40,7 @@ mkExtraObj dflags extn xs oFile <- newTempName dflags TFL_GhcSession "o" writeFile cFile xs ccInfo <- liftIO $ getCompilerInfo dflags - runCc dflags + runCc Nothing dflags ([Option "-c", FileOption "" cFile, Option "-o", diff --git a/compiler/main/SysTools/Tasks.hs b/compiler/main/SysTools/Tasks.hs index 9e3df26877..a3d312e30e 100644 --- a/compiler/main/SysTools/Tasks.hs +++ b/compiler/main/SysTools/Tasks.hs @@ -10,6 +10,7 @@ module SysTools.Tasks where import Exception import ErrUtils +import HscTypes import DynFlags import Outputable import Platform @@ -58,11 +59,12 @@ runPp dflags args = do opts = map Option (getOpts dflags opt_F) runSomething dflags "Haskell pre-processor" prog (args ++ opts) -runCc :: DynFlags -> [Option] -> IO () -runCc dflags args = do +-- | Run compiler of C-like languages and raw objects (such as gcc or clang). +runCc :: Maybe ForeignSrcLang -> DynFlags -> [Option] -> IO () +runCc mLanguage dflags args = do let (p,args0) = pgm_c dflags - args1 = map Option (getOpts dflags opt_c) - args2 = args0 ++ args ++ args1 + args1 = map Option userOpts + args2 = args0 ++ languageOptions ++ args ++ args1 -- We take care to pass -optc flags in args1 last to ensure that the -- user can override flags passed by GHC. See #14452. mb_env <- getGccEnv args2 @@ -118,6 +120,21 @@ runCc dflags args = do | "warning: call-clobbered register used" `isContainedIn` w = False | otherwise = True + -- force the C compiler to interpret this file as C when + -- compiling .hc files, by adding the -x c option. + -- Also useful for plain .c files, just in case GHC saw a + -- -x c option. + (languageOptions, userOpts) = case mLanguage of + Nothing -> ([], userOpts_c) + Just language -> ([Option "-x", Option languageName], opts) where + (languageName, opts) = case language of + LangCxx -> ("c++", userOpts_cxx) + LangObjc -> ("objective-c", userOpts_c) + LangObjcxx -> ("objective-c++", userOpts_cxx) + _ -> ("c", userOpts_c) + userOpts_c = getOpts dflags opt_c + userOpts_cxx = getOpts dflags opt_cxx + isContainedIn :: String -> String -> Bool xs `isContainedIn` ys = any (xs `isPrefixOf`) (tails ys) |