diff options
author | Sergei Trofimovich <slyfox@gentoo.org> | 2017-03-29 17:30:50 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-03-29 18:06:21 -0400 |
commit | 01b062ec3fa138b92124ce7ca4deca0ddcb474ea (patch) | |
tree | b37ab33bf148c86aa3d7aa94f450d4ef8a248e89 /compiler/cbits | |
parent | 26c95f46e679fb73e1ec2bec2be0801c72fd1449 (diff) | |
download | haskell-01b062ec3fa138b92124ce7ca4deca0ddcb474ea.tar.gz |
unique: fix UNIQUE_BITS crosscompilation (Trac #13491)
The #13491 manifests best when we try to crosscompile
from 32-bit (i386-linux) to 64-bit (powerpc64-linux)
system:
./configure --target=powerpc64-unknown-linux-gnu
The build fails at assembly time:
"inplace/bin/ghc-stage1" ... -c rts/StgStartup.cmm
/tmp/ghc19687_0/ghc_4.s: Assembler messages:
/tmp/ghc19687_0/ghc_4.s:11:0: error:
Error: unknown pseudo-op: `.l'
|
11 | .L<\x00>4:
| ^
That happens because UNIQUE_BITS is defined in terms
of WORD_SIZE_IN_BITS macro:
#define UNIQUE_BITS (WORD_SIZE_IN_BITS - 8)
WORD_SIZE_IN_BITS is 64 bits (equals to target value)
while ghc-stage1 is still running on i386-linux
The fix is to stop relying on target macros and use
host's 'sizeof (HsInt)' and 'finiteBitSize' way to
determine unique layout.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Test Plan: build i386-to-powerpc64 crosscompiler
Reviewers: rwbarton, austin, bgamari
Reviewed By: bgamari
Subscribers: RyanGlScott, thomie
Differential Revision: https://phabricator.haskell.org/D3397
Diffstat (limited to 'compiler/cbits')
-rw-r--r-- | compiler/cbits/genSym.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/compiler/cbits/genSym.c b/compiler/cbits/genSym.c index 4af39408ed..6943ab15d6 100644 --- a/compiler/cbits/genSym.c +++ b/compiler/cbits/genSym.c @@ -5,6 +5,7 @@ static HsInt GenSymCounter = 0; static HsInt GenSymInc = 1; +#define UNIQUE_BITS (sizeof (HsInt) * 8 - UNIQUE_TAG_BITS) #define UNIQUE_MASK ((1ULL << UNIQUE_BITS) - 1) STATIC_INLINE void checkUniqueRange(HsInt u STG_UNUSED) { |