summaryrefslogtreecommitdiff
path: root/compiler/cbits
diff options
context:
space:
mode:
authorBartosz Nitka <niteria@gmail.com>2015-10-27 15:17:32 +0100
committerBen Gamari <ben@smart-cactus.org>2015-10-27 15:20:38 +0100
commit158d2a91581d82dc1690a858b474eaab3a02e43e (patch)
tree178aad1b3bcb80923d2376e784f3e87074dd5821 /compiler/cbits
parentd1d8704cb3d003315177fad1394fce49f98fb1a2 (diff)
downloadhaskell-158d2a91581d82dc1690a858b474eaab3a02e43e.tar.gz
Make it possible to have different UniqSupply strategies
To get reproducible/deterministic builds, the way that the Uniques are assigned shouldn't matter. This allows to test for that. It add 2 new flags: * `-dinitial-unique` * `-dunique-increment` And by varying these you can get interesting effects: * `-dinitial-unique=0 -dunique-increment 1` - current sequential UniqSupply * `-dinitial-unique=16777215 -dunique-increment -1` - UniqSupply that generates in decreasing order * `-dinitial-unique=1 -dunique-increment PRIME` - where PRIME big enough to overflow often - nonsequential order I haven't proven the usefullness of the last one yet and it's the reason why we have to mask the bits with `0xFFFFFF` in `genSym`, so I can remove it if it becomes contentious. Test Plan: validate on harbormaster Reviewers: simonmar, austin, ezyang, bgamari Reviewed By: austin, bgamari Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D1360 GHC Trac Issues: #4012
Diffstat (limited to 'compiler/cbits')
-rw-r--r--compiler/cbits/genSym.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/compiler/cbits/genSym.c b/compiler/cbits/genSym.c
index 08d403d849..70ea417c4b 100644
--- a/compiler/cbits/genSym.c
+++ b/compiler/cbits/genSym.c
@@ -2,16 +2,21 @@
#include "Rts.h"
static HsInt GenSymCounter = 0;
+static HsInt GenSymInc = 1;
HsInt genSym(void) {
#if defined(THREADED_RTS)
if (n_capabilities == 1) {
- return GenSymCounter++;
+ return GenSymCounter = (GenSymCounter + GenSymInc) & 0xFFFFFF;
} else {
- return atomic_inc((StgWord *)&GenSymCounter, 1);
+ return atomic_inc((StgWord *)&GenSymCounter, GenSymInc) & 0xFFFFFF;
}
#else
- return GenSymCounter++;
+ return GenSymCounter = (GenSymCounter + GenSymInc) & 0xFFFFFF;
#endif
}
+void initGenSym(HsInt NewGenSymCounter, HsInt NewGenSymInc) {
+ GenSymCounter = NewGenSymCounter;
+ GenSymInc = NewGenSymInc;
+}