Optimization 为什么ghc在其自身构建中通过了相互矛盾的优化标志?

Optimization 为什么ghc在其自身构建中通过了相互矛盾的优化标志?,optimization,compilation,ghc,Optimization,Compilation,Ghc,我再次从源代码构建GHC(在ARM上,因为没有二进制版本),并注意到它在某个时候会这样做: "inplace/bin/ghc-stage1" -static -optc-DTHREADED_RTS -optc-DDEBUG -H32m \ -O -Iincludes -Iincludes/dist -Iincludes/dist-derivedconstants/header \ -Iincludes/dist-ghcconstants/header -Irts -Irts/

我再次从源代码构建GHC(在ARM上,因为没有二进制版本),并注意到它在某个时候会这样做:

"inplace/bin/ghc-stage1" -static -optc-DTHREADED_RTS -optc-DDEBUG  -H32m   \
   -O -Iincludes -Iincludes/dist -Iincludes/dist-derivedconstants/header \ 
   -Iincludes/dist-ghcconstants/header -Irts -Irts/dist/build -DCOMPILING_RTS \
   -package-name rts -dcmm-lint   -i -irts -irts/dist/build        \
   -irts/dist/build/autogen -Irts/dist/build -Irts/dist/build/autogen    \
   -O2 -O0    -c rts/StgMiscClosures.cmm -o rts/dist/build/StgMiscClosures.thr_debug_o
好的,这是一个命令中的
-O
-O2
-O0


原因是什么?在这种情况下,哪个标志优先?

processArgs
从左到右处理命令行参数(请参阅)。此外,
-O
标志的语义使得它们每个都打开/关闭单个优化的特定子集(请参阅)因此,在您的示例中,
-O0
“赢”,因为它覆盖了
-O
-O2
processArgs
从左到右处理命令行参数(请参阅)。此外,
-O
标志的语义是这样的:它们每个都打开/关闭单个优化的特定子集(请参阅).因此,在您的示例中,
-O0
“wins”因为它覆盖了
-O
-O2

Ok的效果。GHC构建通过使用命令行作为一种调用堆栈来利用这一点,隐藏不需要的、不太具体的标志,而不费事删除前面的标志?似乎是这样,是的。好的。GHC构建通过使用命令行作为一种调用来利用这一点大头钉,不需要的阴影,不太具体的旗帜,而不费心删除前面的那些?似乎是这样,是的。