summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-08-21 14:45:44 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-08-21 14:45:44 +0000
commit9b645e9e5413fe060c1483171fc98f5baec1c6a4 (patch)
tree1f31998f523caf20ccb813082e36215a5939b302 /compiler
parente0939bc459e2fd5420f875ee3065dca14114bf31 (diff)
downloadhaskell-9b645e9e5413fe060c1483171fc98f5baec1c6a4.tar.gz
-fPIC -fvia-C issues a warning and ignores -fvia-C
Also, -fPIC causes an error if the target is registerised and has no native code generator.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/main/DynFlags.hs21
-rw-r--r--compiler/main/StaticFlagParser.hs11
2 files changed, 28 insertions, 4 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 1969c3b629..55dc8c77da 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -1926,7 +1926,7 @@ parseDynamicNoPackageFlags dflags args = parseDynamicFlags_ dflags args False
parseDynamicFlags_ :: Monad m =>
DynFlags -> [Located String] -> Bool
-> m (DynFlags, [Located String], [Located String])
-parseDynamicFlags_ dflags args pkg_flags = do
+parseDynamicFlags_ dflags0 args pkg_flags = do
-- XXX Legacy support code
-- We used to accept things like
-- optdep-f -optdepdepend
@@ -1943,10 +1943,23 @@ parseDynamicFlags_ dflags args pkg_flags = do
flag_spec | pkg_flags = package_flags ++ dynamic_flags
| otherwise = dynamic_flags
- let ((leftover, errs, warns), dflags')
- = runCmdLine (processArgs flag_spec args') dflags
+ let ((leftover, errs, warns), dflags1)
+ = runCmdLine (processArgs flag_spec args') dflags0
when (not (null errs)) $ ghcError $ errorsToGhcException errs
- return (dflags', leftover, warns)
+
+ -- Cannot use -fPIC with registerised -fvia-C, because the mangler
+ -- isn't up to the job. We know that if hscTarget == HscC, then the
+ -- user has explicitly used -fvia-C, because -fasm is the default,
+ -- unless there is no NCG on this platform. The latter case is
+ -- checked when the -fPIC flag is parsed.
+ --
+ let (pic_warns, dflags2) =
+ if opt_PIC && hscTarget dflags1 == HscC && cGhcUnregisterised == "NO"
+ then ([L noSrcSpan $ "Warning: -fvia-C is incompatible with -fPIC; ignoring -fvia-C"],
+ dflags1{ hscTarget = HscAsm })
+ else ([], dflags1)
+
+ return (dflags2, leftover, pic_warns ++ warns)
type DynP = CmdLineP DynFlags
diff --git a/compiler/main/StaticFlagParser.hs b/compiler/main/StaticFlagParser.hs
index a153435967..bcc96a676f 100644
--- a/compiler/main/StaticFlagParser.hs
+++ b/compiler/main/StaticFlagParser.hs
@@ -138,6 +138,11 @@ static_flags = [
, Flag "Rghc-timing" (NoArg (enableTimingStats)) Supported
------ Compiler flags -----------------------------------------------
+
+ -- -fPIC requires extra checking: only the NCG supports it.
+ -- See also DynFlags.parseDynamicFlags.
+ , Flag "fPIC" (PassFlag setPIC) Supported
+
-- All other "-fno-<blah>" options cancel out "-f<blah>" on the hsc cmdline
, Flag "fno-"
(PrefixPred (\s -> isStaticFlag ("f"++s)) (\s -> removeOpt ("-f"++s)))
@@ -147,6 +152,12 @@ static_flags = [
, Flag "f" (AnySuffixPred isStaticFlag addOpt) Supported
]
+setPIC :: String -> IO ()
+setPIC | cGhcWithNativeCodeGen == "YES" || cGhcUnregisterised == "YES"
+ = addOpt
+ | otherwise
+ = ghcError $ CmdLineError "-fPIC is not supported on this platform"
+
isStaticFlag :: String -> Bool
isStaticFlag f =
f `elem` [