|
1 | 1 | #!/bin/sh |
2 | | -# |
3 | | -# Usage: cd /usr/src/contrib/jemalloc |
4 | | -# ./FREEBSD-upgrade <command> [args] |
5 | | -# |
6 | | -# At least the following ports are required when importing jemalloc: |
7 | | -# - devel/autoconf |
8 | | -# - devel/git |
9 | | -# - devel/gmake |
10 | | -# - textproc/docbook-xsl |
11 | | -# - textproc/libxslt |
12 | | -# |
13 | | -# The normal workflow for importing a new release is: |
14 | | -# |
15 | | -# cd /usr/src/contrib/jemalloc |
16 | | -# |
17 | | -# Merge local changes that were made since the previous import: |
18 | | -# |
19 | | -# ./FREEBSD-upgrade merge-changes |
20 | | -# ./FREEBSD-upgrade rediff |
21 | | -# |
22 | | -# Extract latest jemalloc release. |
23 | | -# |
24 | | -# ./FREEBSD-upgrade extract <rev> |
25 | | -# |
26 | | -# Fix patch conflicts as necessary, then regenerate diffs to update line |
27 | | -# offsets: |
28 | | -# |
29 | | -# ./FREEBSD-upgrade rediff |
30 | | -# ./FREEBSD-upgrade extract <rev> |
31 | | -# |
32 | | -# Do multiple buildworld/installworld rounds. If problems arise and patches |
33 | | -# are needed, edit the code in ${work} as necessary, then: |
34 | | -# |
35 | | -# ./FREEBSD-upgrade rediff |
36 | | -# ./FREEBSD-upgrade extract <rev> |
37 | | -# |
38 | | -# The rediff/extract order is important because rediff saves the local |
39 | | -# changes, then extract blows away the work tree and re-creates it with the |
40 | | -# diffs applied. |
41 | | -# |
42 | | -# Finally, to clean up: |
43 | | -# |
44 | | -# ./FREEBSD-upgrade clean |
45 | 2 |
|
46 | | -set -e |
47 | | -set -x |
| 3 | +# Note: you need docbook installed, as well as gmake (we need it to |
| 4 | +# make private_namespace.h) |
48 | 5 |
|
49 | | -if [ ! -x "FREEBSD-upgrade" ] ; then |
50 | | - echo "Run from within src/contrib/jemalloc/" >&2 |
51 | | - exit 1 |
52 | | -fi |
| 6 | +# git subtree merge -- not committed at this time. |
| 7 | + git subtree merge -P contrib/jemalloc vendor/jemalloc |
| 8 | +cd contrib/jemalloc |
53 | 9 |
|
54 | | -if [ "x${JEMALLOC_REPO}" = "x" ] ; then |
55 | | - JEMALLOC_REPO=https://github.com/jemalloc/jemalloc.git |
56 | | -fi |
| 10 | +# Gut the tests, since they take up too much space. |
| 11 | +# Everything else can stay, but if not, add more to trim (there's |
| 12 | +# always a trade off between time and saved size. |
| 13 | +git rm -rf test msvc |
| 14 | +git commit --amend |
57 | 15 |
|
58 | | -src=`pwd` |
| 16 | +# kill the tests with empty files so we don't have to hack configure.ac |
| 17 | +mkdir -p test/include/test |
| 18 | +touch test/include/test/jemalloc_test_defs.h.in |
| 19 | +touch test/include/test/jemalloc_test.h.in |
| 20 | +echo 'exit 0' > test/test.sh.in |
59 | 21 |
|
60 | | -jemalloc_tmp="jemalloc.tmp" |
61 | | -tmpdir="${src}/../${jemalloc_tmp}" |
62 | | -bare_repo="${tmpdir}/jemalloc_bare.git" |
63 | | -work="jemalloc_work.git" |
64 | | -work_repo="${tmpdir}/${work}" |
65 | | -namespace_repo="${tmpdir}/jemalloc_namespace.git" |
66 | | -changes="${src}/FREEBSD-changes" |
67 | | - |
68 | | -do_fetch() { |
69 | | - local rev=$1 |
70 | | - if [ ! -d "${bare_repo}" ] ; then |
71 | | - mkdir -p "${bare_repo}" |
72 | | - git clone --bare ${JEMALLOC_REPO} ${bare_repo} |
73 | | - fi |
74 | | - ( |
75 | | - cd ${bare_repo} |
76 | | - git fetch origin ${rev} |
77 | | - ) |
78 | | -} |
| 22 | +# Reconfigure -- needed only to regenerate the .h files... We don't |
| 23 | +# use all the files generated. |
| 24 | +# |
| 25 | +# Also note: 5.2 lacks --with-lg-page-sizes, but 5.3 has it. |
| 26 | +# Also, there's got to be a way to not hard-wire version / hash. |
| 27 | +./autogen.sh --enable-xmalloc --enable-fill --enable-lazy-lock --enable-stats \ |
| 28 | + --enable-utrace --with-malloc-conf=abort_conf:false \ |
| 29 | + --with-xslroot=/usr/local/share/xsl/docbook --with-private-namespace=__ \ |
| 30 | + --with-lg-page-sizes=12,13,14,15,16 \ |
| 31 | + --with-version=5.3.0-0-g54eaed1d8b56b1aa528be3bdd1877e59c56fa90c |
79 | 32 |
|
80 | | -do_extract_helper() { |
81 | | - local rev=$1 |
82 | | - local repo=$2 |
83 | | - do_fetch ${rev} |
84 | | - rm -rf ${repo} |
85 | | - git clone ${bare_repo} ${repo} |
86 | | - ( |
87 | | - cd ${repo} |
88 | | - if [ "x${rev}" != "x" ] ; then |
89 | | - # Use optional rev argument to check out a revision other than HEAD on |
90 | | - # master. |
91 | | - git checkout ${rev} |
92 | | - fi |
93 | | - ) |
94 | | -} |
| 33 | +# Copy over the important generated .h files in configure |
| 34 | +cp ./include/jemalloc/jemalloc.h ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc |
| 35 | +git add ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc/jemalloc.h |
| 36 | +cp ./include/jemalloc/jemalloc_defs.h ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc |
| 37 | +git add ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc/jemalloc_defs.h |
95 | 38 |
|
96 | | -do_autogen() { |
97 | | - ./autogen.sh --enable-xmalloc --enable-utrace \ |
98 | | - --with-malloc-conf=abort_conf:false \ |
99 | | - --with-xslroot=/usr/local/share/xsl/docbook --with-private-namespace=__ \ |
100 | | - --with-lg-page-sizes=12,13,14,16 |
101 | | -} |
| 39 | +# need to make the namespace .h files, and copy a small subset into the tree |
| 40 | +# These are super-awkward to generate at buildworld time. Also, we assume we |
| 41 | +# only have to make one of these (currently true due to current unlikely to |
| 42 | +# change dependencies. |
| 43 | +gmake include/jemalloc/internal/private_namespace.h |
| 44 | +for i in private_namespace.h jemalloc_internal_defs.h public_namespace.h jemalloc_preamble.h; do |
| 45 | + cp include/jemalloc/internal/$i ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc/internal/ |
| 46 | + git add ../../lib/libc/stdlib/malloc/jemalloc/include/jemalloc/internal/$i |
| 47 | + rm include/jemalloc/internal/$i |
| 48 | +done |
| 49 | +# OK, commit all the generated files |
| 50 | +git add VERSION |
| 51 | +git commit --amend |
102 | 52 |
|
103 | | -do_extract_diff() { |
104 | | - local rev=$1 |
105 | | - local repo=$2 |
106 | | - do_extract_helper ${rev} ${repo} |
107 | | - ( |
108 | | - cd ${repo} |
109 | | - # Apply diffs before generating files. |
110 | | - patch -p1 < "${src}/FREEBSD-diffs" |
111 | | - find . -name '*.orig' -delete |
112 | | - # Generate files. |
113 | | - do_autogen |
114 | | - gmake dist |
115 | | - ) |
116 | | -} |
| 53 | +# Clean up the mess |
| 54 | +git clean -f . |
117 | 55 |
|
118 | | -do_extract_namespace() { |
119 | | - local rev=$1 |
120 | | - local repo=$2 |
121 | | - do_extract_helper ${rev} ${repo} |
122 | | - ( |
123 | | - cd ${repo} |
124 | | - # Generate files. |
125 | | - do_autogen |
126 | | - gmake include/jemalloc/internal/private_namespace.h |
127 | | - ) |
128 | | -} |
| 56 | +# Save the cheat sheet |
| 57 | +cp ~/jemalloc-upd FREEBSD-upgrade |
| 58 | +git add FREEBSD-upgrade |
| 59 | +git commit --amend |
129 | 60 |
|
130 | | -do_extract() { |
131 | | - local rev=$1 |
132 | | - do_fetch ${rev} |
133 | | - do_extract_diff ${rev} ${work_repo} |
134 | | - do_extract_namespace ${rev} ${namespace_repo} |
135 | | -} |
| 61 | +# Remove hash.c from lib/libc/stdlib/malloc/jemalloc/Makefile.inc |
| 62 | +# mutex_pool.c prng.c |
| 63 | +# Add |
| 64 | +# bin_info.c san.c san_bump.c counter.c prof_data.c prof_log.c prof_recent.c prof_stats.c prof_sys.c |
| 65 | +# emap.c edata.c edata_cache.c pa.c pa_extra.c pac.c decay.c hpa.c hpa_hooks.c fxp.c hpdata.c pai.c |
| 66 | +# ecache.c ehooks.c eset.c sec.c cache_bin.c peak_event.c psset.c inspect.c exp_grow.c thread_event.c |
| 67 | +# |
136 | 68 |
|
137 | | -do_diff() { |
138 | | - ( |
139 | | - cd ${work_repo} |
140 | | - find . -name '*.orig' -delete |
141 | | - find . -name '*.rej' -delete |
142 | | - git add -A |
143 | | - git diff --cached |
144 | | - ) > FREEBSD-diffs |
145 | | -} |
| 69 | +# Manually comment out the following in lib/libc/stdlib/malloc/jemalloc/include/jemalloc/jemalloc.h |
| 70 | +# /* #define JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF */ |
| 71 | +# Add |
| 72 | +# #define JEMALLOC_OVERRIDE_VALLOC |
| 73 | +# and #include "jemalloc_FreeBSD.h" |
| 74 | +# With some adjustments to the old jemalloc_FreeBSD.h, but git can help |
146 | 75 |
|
147 | | -command=$1 |
148 | | -shift |
149 | | -case "${command}" in |
150 | | - merge-changes) # Merge local changes that were made since the previous import. |
151 | | - rev=`cat VERSION |tr 'g' ' ' |awk '{print $2}'` |
152 | | - # Extract code corresponding to most recent import. |
153 | | - do_extract ${rev} |
154 | | - # Compute local differences to the upstream+patches and apply them. |
155 | | - ( |
156 | | - cd ${tmpdir} |
157 | | - diff -ru -X ${src}/FREEBSD-Xlist ${work} ../jemalloc > ${changes} || true |
158 | | - ) |
159 | | - ( |
160 | | - cd ${work_repo} |
161 | | - patch -p1 < ${changes} || true |
162 | | - find . -name '*.orig' -delete |
163 | | - ) |
164 | | - # Update diff. |
165 | | - do_diff |
166 | | - ;; |
167 | | - extract) # Extract upstream sources, apply patches, copy to contrib/jemalloc. |
168 | | - rev=$1 |
169 | | - do_extract ${rev} |
170 | | - # Delete existing files so that cruft doesn't silently remain. |
171 | | - rm -rf ChangeLog COPYING VERSION doc include src |
172 | | - # Copy files over. |
173 | | - tar cf - -C ${work_repo} -X FREEBSD-Xlist . |tar xvf - |
174 | | - internal_dir="include/jemalloc/internal" |
175 | | - grep -v ' isthreaded ' \ |
176 | | - "${namespace_repo}/${internal_dir}/private_namespace.h" \ |
177 | | - > "${internal_dir}/private_namespace.h" |
178 | | - ;; |
179 | | - rediff) # Regenerate diffs based on working tree. |
180 | | - do_diff |
181 | | - ;; |
182 | | - clean) # Remove working tree and temporary files. |
183 | | - rm -rf ${tmpdir} ${changes} |
184 | | - ;; |
185 | | - *) |
186 | | - echo "Unsupported command: \"${command}\"" >&2 |
187 | | - exit 1 |
188 | | - ;; |
189 | | -esac |
| 76 | +# Had to manually remove |
| 77 | +# -#define __malloc_options_1_0 JEMALLOC_N(__malloc_options_1_0) |
| 78 | +# -#define _malloc_first_thread JEMALLOC_N(_malloc_first_thread) |
| 79 | +# -#define __malloc_message_1_0 JEMALLOC_N(__malloc_message_1_0) |
| 80 | +# -#define isthreaded JEMALLOC_N(isthreaded) |
| 81 | +# |
| 82 | +# Also had to remove the following to fix jemalloc 3 ABI compat |
| 83 | +# -#define je_allocm JEMALLOC_N(je_allocm) |
| 84 | +# -#define je_dallocm JEMALLOC_N(je_dallocm) |
| 85 | +# -#define je_nallocm JEMALLOC_N(je_nallocm) |
| 86 | +# -#define je_rallocm JEMALLOC_N(je_rallocm) |
| 87 | +# -#define je_sallocm JEMALLOC_N(je_sallocm) |
| 88 | +# Without the diff you end up with non-exported _je_je*allocm symbols. With you get symbols of the form: |
| 89 | +# 365: 000000000018e2a0 406 FUNC WEAK DEFAULT 14 rallocm@FBSD_1.3 (5) |
| 90 | +# 657: 000000000018e2a0 406 FUNC GLOBAL DEFAULT 14 __rallocm@FBSD_1.3 (5) |
| 91 | +# |
0 commit comments