From 9691b2221175d35e6e49884e5780b1d1695d338e Mon Sep 17 00:00:00 2001 From: "Ben.Lippmeier@anu.edu.au" Date: Sat, 26 Sep 2009 07:55:07 +0000 Subject: [PATCH] Fix building of the RTS with the NCG under Windows --- compiler/nativeGen/PIC.hs | 32 ++++++++++++++++++++++++++++---- rts/ghc.mk | 6 ------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/compiler/nativeGen/PIC.hs b/compiler/nativeGen/PIC.hs index 74c8bb3..eb233e0 100644 --- a/compiler/nativeGen/PIC.hs +++ b/compiler/nativeGen/PIC.hs @@ -192,16 +192,40 @@ data LabelAccessStyle howToAccessLabel :: DynFlags -> Arch -> OS -> ReferenceKind -> CLabel -> LabelAccessStyle + -- Windows --- --- We need to use access *exactly* those things that --- are imported from a DLL via an __imp_* label. --- There are no stubs for imported code. +-- In Windows speak, a "module" is a set of objects linked into the +-- same Portable Exectuable (PE) file. (both .exe and .dll files are PEs). +-- +-- If we're compiling a multi-module program then symbols from other modules +-- are accessed by a symbol pointer named __imp_SYMBOL. At runtime we have the +-- following. +-- +-- (in the local module) +-- __imp_SYMBOL: addr of SYMBOL +-- +-- (in the other module) +-- SYMBOL: the real function / data. +-- +-- To access the function at SYMBOL from our local module, we just need to +-- dereference the local __imp_SYMBOL. +-- +-- If opt_Static is set then we assume that all our code will be linked +-- into the same .exe file. In this case we always access symbols directly, +-- and never use __imp_SYMBOL. -- howToAccessLabel dflags _ OSMinGW32 _ lbl + + -- Assume all symbols will be in the same PE, so just access them directly. + | opt_Static + = AccessDirectly + + -- If the target symbol is in another PE we need to access it via the + -- appropriate __imp_SYMBOL pointer. | labelDynamic (thisPackage dflags) lbl = AccessViaSymbolPtr + -- Target symbol is in the same PE as the caller, so just access it directly. | otherwise = AccessDirectly diff --git a/rts/ghc.mk b/rts/ghc.mk index 970adaa..3a746a9 100644 --- a/rts/ghc.mk +++ b/rts/ghc.mk @@ -173,12 +173,6 @@ ifeq "$(UseLibFFIForAdjustors)" "YES" rts_CC_OPTS += -DUSE_LIBFFI_FOR_ADJUSTORS endif -ifeq "$(Windows)" "YES" -# SDM: when compiled with -fasm the RTS currently has bogus references to -# __imp_base_ things, so working around for now: -rts_HC_OPTS += -fvia-C -endif - ifneq "$(DYNAMIC_RTS)" "YES" rts_HC_OPTS += -static else -- 1.7.10.4