Skip to content

Commit adb8b0b

Browse files
committed
auto merge of #14006 : thestinger/rust/jemalloc, r=alexcrichton
Closes #11807
2 parents 11571cd + 81fadbb commit adb8b0b

30 files changed

+570
-217
lines changed

.gitattributes

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@ src/etc/pkg/rust-logo.ico binary
88
src/etc/pkg/rust-logo.png binary
99
src/rt/msvc/* -whitespace
1010
src/rt/vg/* -whitespace
11-
src/rt/jemalloc/**/* -whitespace

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@
1515
[submodule "src/rt/hoedown"]
1616
path = src/rt/hoedown
1717
url = https://github.com/rust-lang/hoedown.git
18+
[submodule "src/jemalloc"]
19+
path = src/jemalloc
20+
url = https://github.com/rust-lang/jemalloc.git

configure

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ do
782782
for s in 0 1 2 3
783783
do
784784
make_dir $t/rt/stage$s
785+
make_dir $t/rt/jemalloc
785786
make_dir $t/rt/libuv
786787
make_dir $t/rt/libuv/src/ares
787788
make_dir $t/rt/libuv/src/eio

mk/crates.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ CRATES := $(TARGET_CRATES) $(HOST_CRATES)
5757
TOOLS := compiletest rustdoc rustc
5858

5959
DEPS_core :=
60-
DEPS_std := core libc native:rustrt native:compiler-rt native:backtrace
60+
DEPS_std := core libc native:rustrt native:compiler-rt native:backtrace native:jemalloc
6161
DEPS_green := std rand native:context_switch
6262
DEPS_rustuv := std native:uv native:uv_support
6363
DEPS_native := std

mk/platform.mk

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ CFG_LIB_NAME_x86_64-unknown-linux-gnu=lib$(1).so
145145
CFG_STATIC_LIB_NAME_x86_64-unknown-linux-gnu=lib$(1).a
146146
CFG_LIB_GLOB_x86_64-unknown-linux-gnu=lib$(1)-*.so
147147
CFG_LIB_DSYM_GLOB_x86_64-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
148+
CFG_CFLAGS_x86_64-unknown-linux-gnu := -m64
148149
CFG_GCCISH_CFLAGS_x86_64-unknown-linux-gnu := -Wall -Werror -g -fPIC -m64
149150
CFG_GCCISH_CXXFLAGS_x86_64-unknown-linux-gnu := -fno-rtti
150151
CFG_GCCISH_LINK_FLAGS_x86_64-unknown-linux-gnu := -shared -fPIC -ldl -pthread -lrt -g -m64
@@ -172,6 +173,7 @@ CFG_LIB_NAME_i686-unknown-linux-gnu=lib$(1).so
172173
CFG_STATIC_LIB_NAME_i686-unknown-linux-gnu=lib$(1).a
173174
CFG_LIB_GLOB_i686-unknown-linux-gnu=lib$(1)-*.so
174175
CFG_LIB_DSYM_GLOB_i686-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
176+
CFG_CFLAGS_i686-unknown-linux-gnu := -m32
175177
CFG_GCCISH_CFLAGS_i686-unknown-linux-gnu := -Wall -Werror -g -fPIC -m32
176178
CFG_GCCISH_CXXFLAGS_i686-unknown-linux-gnu := -fno-rtti
177179
CFG_GCCISH_LINK_FLAGS_i686-unknown-linux-gnu := -shared -fPIC -ldl -pthread -lrt -g -m32
@@ -201,6 +203,7 @@ AR_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos ar)
201203
CFG_LIB_NAME_arm-apple-darwin = lib$(1).dylib
202204
CFG_LIB_GLOB_arm-apple-darwin = lib$(1)-*.dylib
203205
CFG_LIB_DSYM_GLOB_arm-apple-darwin = lib$(1)-*.dylib.dSYM
206+
CFG_CFLAGS_arm-apple-darwin := $(CFG_IOS_FLAGS)
204207
CFG_GCCISH_CFLAGS_arm-apple-darwin := -Wall -Werror -g -fPIC $(CFG_IOS_FLAGS)
205208
CFG_GCCISH_CXXFLAGS_arm-apple-darwin := -fno-rtti $(CFG_IOS_FLAGS)
206209
CFG_GCCISH_LINK_FLAGS_arm-apple-darwin := -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
@@ -229,6 +232,7 @@ CFG_LIB_NAME_x86_64-apple-darwin=lib$(1).dylib
229232
CFG_STATIC_LIB_NAME_x86_64-apple-darwin=lib$(1).a
230233
CFG_LIB_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib
231234
CFG_LIB_DSYM_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib.dSYM
235+
CFG_CFLAGS_x86_64-apple-darwin := -m64 -arch x86_64
232236
CFG_GCCISH_CFLAGS_x86_64-apple-darwin := -Wall -Werror -g -fPIC -m64 -arch x86_64
233237
CFG_GCCISH_CXXFLAGS_x86_64-apple-darwin := -fno-rtti
234238
CFG_GCCISH_LINK_FLAGS_x86_64-apple-darwin := -dynamiclib -pthread -framework CoreServices -m64
@@ -256,6 +260,7 @@ CFG_LIB_NAME_i686-apple-darwin=lib$(1).dylib
256260
CFG_STATIC_LIB_NAME_i686-apple-darwin=lib$(1).a
257261
CFG_LIB_GLOB_i686-apple-darwin=lib$(1)-*.dylib
258262
CFG_LIB_DSYM_GLOB_i686-apple-darwin=lib$(1)-*.dylib.dSYM
263+
CFG_CFLAGS_i686-apple-darwin := -m32 -arch i386
259264
CFG_GCCISH_CFLAGS_i686-apple-darwin := -Wall -Werror -g -fPIC -m32 -arch i386
260265
CFG_GCCISH_CXXFLAGS_i686-apple-darwin := -fno-rtti
261266
CFG_GCCISH_LINK_FLAGS_i686-apple-darwin := -dynamiclib -pthread -framework CoreServices -m32
@@ -283,6 +288,7 @@ CFG_LIB_NAME_arm-linux-androideabi=lib$(1).so
283288
CFG_STATIC_LIB_NAME_arm-linux-androideabi=lib$(1).a
284289
CFG_LIB_GLOB_arm-linux-androideabi=lib$(1)-*.so
285290
CFG_LIB_DSYM_GLOB_arm-linux-androideabi=lib$(1)-*.dylib.dSYM
291+
CFG_CFLAGS_arm-linux-androideabi := -D__arm__ -DANDROID -D__ANDROID__
286292
CFG_GCCISH_CFLAGS_arm-linux-androideabi := -Wall -g -fPIC -D__arm__ -DANDROID -D__ANDROID__
287293
CFG_GCCISH_CXXFLAGS_arm-linux-androideabi := -fno-rtti
288294
CFG_GCCISH_LINK_FLAGS_arm-linux-androideabi := -shared -fPIC -ldl -g -lm -lsupc++
@@ -313,6 +319,7 @@ CFG_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).so
313319
CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).a
314320
CFG_LIB_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.so
315321
CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.dylib.dSYM
322+
CFG_CFLAGS_arm-unknown-linux-gnueabihf := -D__arm__
316323
CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC -D__arm__
317324
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti
318325
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
@@ -343,6 +350,7 @@ CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
343350
CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).a
344351
CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
345352
CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
353+
CFG_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfpu=vfp
346354
CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfpu=vfp
347355
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti
348356
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
@@ -372,6 +380,7 @@ CFG_LIB_NAME_mips-unknown-linux-gnu=lib$(1).so
372380
CFG_STATIC_LIB_NAME_mips-unknown-linux-gnu=lib$(1).a
373381
CFG_LIB_GLOB_mips-unknown-linux-gnu=lib$(1)-*.so
374382
CFG_LIB_DSYM_GLOB_mips-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
383+
CFG_CFLAGS_mips-unknown-linux-gnu := -mips32r2 -msoft-float -mabi=32 -mno-compact-eh
375384
CFG_GCCISH_CFLAGS_mips-unknown-linux-gnu := -Wall -g -fPIC -mips32r2 -msoft-float -mabi=32 -mno-compact-eh
376385
CFG_GCCISH_CXXFLAGS_mips-unknown-linux-gnu := -fno-rtti
377386
CFG_GCCISH_LINK_FLAGS_mips-unknown-linux-gnu := -shared -fPIC -g -mips32r2 -msoft-float -mabi=32
@@ -400,6 +409,7 @@ CFG_LIB_NAME_i686-pc-mingw32=$(1).dll
400409
CFG_STATIC_LIB_NAME_i686-pc-mingw32=$(1).lib
401410
CFG_LIB_GLOB_i686-pc-mingw32=$(1)-*.dll
402411
CFG_LIB_DSYM_GLOB_i686-pc-mingw32=$(1)-*.dylib.dSYM
412+
CFG_CFLAGS_mips-i686-pc-mingw32 := -m32 -march=i686 -D_WIN32_WINNT=0x0600
403413
CFG_GCCISH_CFLAGS_i686-pc-mingw32 := -Wall -Werror -g -m32 -march=i686 -D_WIN32_WINNT=0x0600 -I$(CFG_SRC_DIR)src/etc/mingw-fix-include
404414
CFG_GCCISH_CXXFLAGS_i686-pc-mingw32 := -fno-rtti
405415
CFG_GCCISH_LINK_FLAGS_i686-pc-mingw32 := -shared -fPIC -g -m32
@@ -428,6 +438,7 @@ CFG_LIB_NAME_i586-mingw32msvc=$(1).dll
428438
CFG_STATIC_LIB_NAME_i586-mingw32msvc=$(1).lib
429439
CFG_LIB_GLOB_i586-mingw32msvc=$(1)-*.dll
430440
CFG_LIB_DSYM_GLOB_i586-mingw32msvc=$(1)-*.dylib.dSYM
441+
CFG_CFLAGS_i586-mingw32msvc := -march=i586 -m32
431442
CFG_GCCISH_CFLAGS_i586-mingw32msvc := -Wall -Werror -g -march=i586 -m32
432443
CFG_GCCISH_CXXFLAGS_i586-mingw32msvc := -fno-rtti
433444
CFG_GCCISH_LINK_FLAGS_i586-mingw32msvc := -shared -g -m32
@@ -458,6 +469,7 @@ CFG_LIB_NAME_i686-w64-mingw32=$(1).dll
458469
CFG_STATIC_LIB_NAME_i686-w64-mingw32=$(1).lib
459470
CFG_LIB_GLOB_i686-w64-mingw32=$(1)-*.dll
460471
CFG_LIB_DSYM_GLOB_i686-w64-mingw32=$(1)-*.dylib.dSYM
472+
CFG_CFLAGS_i586-w64-mingw32 := -march=i586 -m32 -D_WIN32_WINNT=0x0600
461473
CFG_GCCISH_CFLAGS_i686-w64-mingw32 := -Wall -Werror -g -m32 -D_WIN32_WINNT=0x0600
462474
CFG_GCCISH_CXXFLAGS_i686-w64-mingw32 := -fno-rtti
463475
CFG_GCCISH_LINK_FLAGS_i686-w64-mingw32 := -shared -g -m32
@@ -487,6 +499,7 @@ CFG_LIB_NAME_x86_64-w64-mingw32=$(1).dll
487499
CFG_STATIC_LIB_NAME_x86_64-w64-mingw32=$(1).lib
488500
CFG_LIB_GLOB_x86_64-w64-mingw32=$(1)-*.dll
489501
CFG_LIB_DSYM_GLOB_x86_64-w64-mingw32=$(1)-*.dylib.dSYM
502+
CFG_CFLAGS_x86_64-w64-mingw32 := -m64 -D_WIN32_WINNT=0x0600
490503
CFG_GCCISH_CFLAGS_x86_64-w64-mingw32 := -Wall -Werror -g -m64 -D_WIN32_WINNT=0x0600
491504
CFG_GCCISH_CXXFLAGS_x86_64-w64-mingw32 := -fno-rtti
492505
CFG_GCCISH_LINK_FLAGS_x86_64-w64-mingw32 := -shared -g -m64
@@ -515,6 +528,7 @@ CFG_LIB_NAME_x86_64-unknown-freebsd=lib$(1).so
515528
CFG_STATIC_LIB_NAME_x86_64-unknown-freebsd=lib$(1).a
516529
CFG_LIB_GLOB_x86_64-unknown-freebsd=lib$(1)-*.so
517530
CFG_LIB_DSYM_GLOB_x86_64-unknown-freebsd=$(1)-*.dylib.dSYM
531+
CFG_CFLAGS_x86_64-unknown-freebsd := -I/usr/local/include
518532
CFG_GCCISH_CFLAGS_x86_64-unknown-freebsd := -Wall -Werror -g -fPIC -I/usr/local/include
519533
CFG_GCCISH_LINK_FLAGS_x86_64-unknown-freebsd := -shared -fPIC -g -pthread -lrt
520534
CFG_GCCISH_DEF_FLAG_x86_64-unknown-freebsd := -Wl,--export-dynamic,--dynamic-list=

mk/rt.mk

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,13 @@ $(foreach lib,$(NATIVE_LIBS), \
122122
################################################################################
123123
# Building third-party targets with external build systems
124124
#
125-
# The only current member of this section is libuv, but long ago this used to
126-
# also be occupied by jemalloc. This location is meant for dependencies which
127-
# have external build systems. It is still assumed that the output of each of
128-
# these steps is a static library in the correct location.
125+
# This location is meant for dependencies which have external build systems. It
126+
# is still assumed that the output of each of these steps is a static library
127+
# in the correct location.
128+
################################################################################
129+
130+
################################################################################
131+
# libuv
129132
################################################################################
130133

131134
define DEF_LIBUV_ARCH_VAR
@@ -154,13 +157,19 @@ define DEF_THIRD_PARTY_TARGETS
154157

155158
ifeq ($$(CFG_WINDOWSY_$(1)), 1)
156159
LIBUV_OSTYPE_$(1) := win
160+
# This isn't necessarily a desired option, but it's harmless and works around
161+
# what appears to be a mingw-w64 bug.
162+
#
163+
# https://sourceforge.net/p/mingw-w64/bugs/395/
164+
JEMALLOC_ARGS_$(1) := --enable-lazy-lock
157165
else ifeq ($(OSTYPE_$(1)), apple-darwin)
158166
LIBUV_OSTYPE_$(1) := mac
159167
else ifeq ($(OSTYPE_$(1)), unknown-freebsd)
160168
LIBUV_OSTYPE_$(1) := freebsd
161169
else ifeq ($(OSTYPE_$(1)), linux-androideabi)
162170
LIBUV_OSTYPE_$(1) := android
163171
LIBUV_ARGS_$(1) := PLATFORM=android host=android OS=linux
172+
JEMALLOC_ARGS_$(1) := --disable-tls
164173
else
165174
LIBUV_OSTYPE_$(1) := linux
166175
endif
@@ -220,6 +229,41 @@ $$(LIBUV_DIR_$(1))/Release/libuv.a: $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1)) \
220229

221230
endif
222231

232+
################################################################################
233+
# jemalloc
234+
################################################################################
235+
236+
ifdef CFG_ENABLE_FAST_MAKE
237+
JEMALLOC_DEPS := $(S)/.gitmodules
238+
else
239+
JEMALLOC_DEPS := $(wildcard \
240+
$(S)src/jemalloc/* \
241+
$(S)src/jemalloc/*/* \
242+
$(S)src/jemalloc/*/*/* \
243+
$(S)src/jemalloc/*/*/*/*)
244+
endif
245+
246+
JEMALLOC_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),jemalloc)
247+
ifeq ($$(CFG_WINDOWSY_$(1)),1)
248+
JEMALLOC_REAL_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),jemalloc_s)
249+
else
250+
JEMALLOC_REAL_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),jemalloc_pic)
251+
endif
252+
JEMALLOC_LIB_$(1) := $$(RT_OUTPUT_DIR_$(1))/$$(JEMALLOC_NAME_$(1))
253+
JEMALLOC_BUILD_DIR_$(1) := $$(RT_OUTPUT_DIR_$(1))/jemalloc
254+
255+
$$(JEMALLOC_LIB_$(1)): $$(JEMALLOC_DEPS) $$(MKFILE_DEPS)
256+
@$$(call E, make: jemalloc)
257+
cd "$$(JEMALLOC_BUILD_DIR_$(1))"; "$(S)src/jemalloc/configure" \
258+
$$(JEMALLOC_ARGS_$(1)) --enable-cc-silence --with-jemalloc-prefix=je_ \
259+
--disable-experimental --build=$(CFG_BUILD) --host=$(1) \
260+
CC="$$(CC_$(1))" \
261+
AR="$$(AR_$(1))" \
262+
RANLIB="$$(AR_$(1)) s" \
263+
EXTRA_CFLAGS="$$(CFG_CFLAGS_$(1))"
264+
$$(Q)$$(MAKE) -C "$$(JEMALLOC_BUILD_DIR_$(1))" build_lib_static
265+
$$(Q)cp $$(JEMALLOC_BUILD_DIR_$(1))/lib/$$(JEMALLOC_REAL_NAME_$(1)) $$(JEMALLOC_LIB_$(1))
266+
223267
################################################################################
224268
# compiler-rt
225269
################################################################################

mk/tests.mk

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ ALL_HS := $(filter-out $(S)src/rt/vg/valgrind.h \
240240
tidy:
241241
@$(call E, check: formatting)
242242
$(Q)find $(S)src -name '*.r[sc]' \
243+
| grep '^$(S)src/jemalloc' -v \
243244
| grep '^$(S)src/libuv' -v \
244245
| grep '^$(S)src/llvm' -v \
245246
| grep '^$(S)src/gyp' -v \
@@ -264,8 +265,9 @@ tidy:
264265
$(Q)find $(S)src -type f -perm +111 \
265266
-not -name '*.rs' -and -not -name '*.py' \
266267
-and -not -name '*.sh' \
267-
| grep '^$(S)src/llvm' -v \
268+
| grep '^$(S)src/jemalloc' -v \
268269
| grep '^$(S)src/libuv' -v \
270+
| grep '^$(S)src/llvm' -v \
269271
| grep '^$(S)src/rt/hoedown' -v \
270272
| grep '^$(S)src/gyp' -v \
271273
| grep '^$(S)src/etc' -v \

src/jemalloc

Submodule jemalloc added at 6a96910

src/libarena/lib.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ use std::cmp;
3333
use std::intrinsics::{TyDesc, get_tydesc};
3434
use std::intrinsics;
3535
use std::mem;
36+
use std::mem::min_align_of;
3637
use std::num;
3738
use std::ptr::read;
3839
use std::rc::Rc;
39-
use std::rt::global_heap;
40+
use std::rt::heap::exchange_malloc;
4041

4142
// The way arena uses arrays is really deeply awful. The arrays are
4243
// allocated, and have capacities reserved, but the fill for the array
@@ -204,7 +205,7 @@ impl Arena {
204205
#[inline]
205206
fn alloc_copy<'a, T>(&'a mut self, op: || -> T) -> &'a T {
206207
unsafe {
207-
let ptr = self.alloc_copy_inner(mem::size_of::<T>(), mem::min_align_of::<T>());
208+
let ptr = self.alloc_copy_inner(mem::size_of::<T>(), min_align_of::<T>());
208209
let ptr: *mut T = transmute(ptr);
209210
mem::move_val_init(&mut (*ptr), op());
210211
return transmute(ptr);
@@ -261,7 +262,7 @@ impl Arena {
261262
unsafe {
262263
let tydesc = get_tydesc::<T>();
263264
let (ty_ptr, ptr) =
264-
self.alloc_noncopy_inner(mem::size_of::<T>(), mem::min_align_of::<T>());
265+
self.alloc_noncopy_inner(mem::size_of::<T>(), min_align_of::<T>());
265266
let ty_ptr: *mut uint = transmute(ty_ptr);
266267
let ptr: *mut T = transmute(ptr);
267268
// Write in our tydesc along with a bit indicating that it
@@ -353,7 +354,29 @@ struct TypedArenaChunk<T> {
353354
}
354355

355356
impl<T> TypedArenaChunk<T> {
357+
#[cfg(stage0)]
356358
#[inline]
359+
fn new(next: Option<Box<TypedArenaChunk<T>>>, capacity: uint)
360+
-> Box<TypedArenaChunk<T>> {
361+
let mut size = mem::size_of::<TypedArenaChunk<T>>();
362+
size = round_up(size, min_align_of::<T>());
363+
let elem_size = mem::size_of::<T>();
364+
let elems_size = elem_size.checked_mul(&capacity).unwrap();
365+
size = size.checked_add(&elems_size).unwrap();
366+
367+
let mut chunk = unsafe {
368+
let chunk = exchange_malloc(size);
369+
let mut chunk: Box<TypedArenaChunk<T>> = cast::transmute(chunk);
370+
mem::move_val_init(&mut chunk.next, next);
371+
chunk
372+
};
373+
374+
chunk.capacity = capacity;
375+
chunk
376+
}
377+
378+
#[inline]
379+
#[cfg(not(stage0))]
357380
fn new(next: Option<Box<TypedArenaChunk<T>>>, capacity: uint)
358381
-> Box<TypedArenaChunk<T>> {
359382
let mut size = mem::size_of::<TypedArenaChunk<T>>();
@@ -363,7 +386,7 @@ impl<T> TypedArenaChunk<T> {
363386
size = size.checked_add(&elems_size).unwrap();
364387

365388
let mut chunk = unsafe {
366-
let chunk = global_heap::exchange_malloc(size);
389+
let chunk = exchange_malloc(size, min_align_of::<TypedArenaChunk<T>>());
367390
let mut chunk: Box<TypedArenaChunk<T>> = cast::transmute(chunk);
368391
mem::move_val_init(&mut chunk.next, next);
369392
chunk
@@ -402,7 +425,7 @@ impl<T> TypedArenaChunk<T> {
402425
fn start(&self) -> *u8 {
403426
let this: *TypedArenaChunk<T> = self;
404427
unsafe {
405-
cast::transmute(round_up(this.offset(1) as uint, mem::min_align_of::<T>()))
428+
cast::transmute(round_up(this.offset(1) as uint, min_align_of::<T>()))
406429
}
407430
}
408431

src/libcollections/hashmap.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ mod table {
4242
use std::prelude::Drop;
4343
use std::ptr;
4444
use std::ptr::RawPtr;
45-
use std::rt::global_heap;
45+
use std::rt::libc_heap;
4646
use std::intrinsics::{size_of, min_align_of, transmute};
4747
use std::intrinsics::{move_val_init, set_memory};
4848
use std::iter::{Iterator, range_step_inclusive};
@@ -243,7 +243,7 @@ mod table {
243243
keys_size, min_align_of::< K >(),
244244
vals_size, min_align_of::< V >());
245245

246-
let buffer = global_heap::malloc_raw(size) as *mut u8;
246+
let buffer = libc_heap::malloc_raw(size) as *mut u8;
247247

248248
// FIXME #13094: If malloc was not at as aligned as we expected,
249249
// our offset calculations are just plain wrong. We could support

src/libcore/should_not_exist.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,30 @@ use str::StrSlice;
2929

3030
#[allow(ctypes)]
3131
extern {
32-
fn malloc(size: uint) -> *u8;
33-
fn free(ptr: *u8);
32+
#[cfg(stage0)]
33+
fn rust_malloc(size: uint) -> *u8;
34+
#[cfg(not(stage0))]
35+
fn rust_malloc(size: uint, align: uint) -> *u8;
36+
fn rust_free(ptr: *u8, size: uint, align: uint);
3437
}
3538

39+
#[cfg(stage0)]
3640
unsafe fn alloc(cap: uint) -> *mut Vec<()> {
3741
let cap = cap.checked_add(&mem::size_of::<Vec<()>>()).unwrap();
38-
let ret = malloc(cap) as *mut Vec<()>;
42+
let ret = rust_malloc(cap) as *mut Vec<()>;
43+
if ret.is_null() {
44+
intrinsics::abort();
45+
}
46+
(*ret).fill = 0;
47+
(*ret).alloc = cap;
48+
ret
49+
}
50+
51+
#[cfg(not(stage0))]
52+
unsafe fn alloc(cap: uint) -> *mut Vec<()> {
53+
let cap = cap.checked_add(&mem::size_of::<Vec<()>>()).unwrap();
54+
// this should use the real alignment, but the new representation will take care of that
55+
let ret = rust_malloc(cap, 8) as *mut Vec<()>;
3956
if ret.is_null() {
4057
intrinsics::abort();
4158
}
@@ -102,7 +119,8 @@ impl FromIterator<char> for ~str {
102119
ptr::copy_nonoverlapping_memory(&mut (*ptr2).data,
103120
&(*ptr).data,
104121
len);
105-
free(ptr as *u8);
122+
// FIXME: #13994: port to the sized deallocation API when available
123+
rust_free(ptr as *u8, 0, 8);
106124
cast::forget(ret);
107125
ret = cast::transmute(ptr2);
108126
ptr = ptr2;
@@ -172,7 +190,7 @@ impl<A: Clone> Clone for ~[A] {
172190
for j in range(0, *i as int) {
173191
ptr::read(&*p.offset(j));
174192
}
175-
free(ret as *u8);
193+
rust_free(ret as *u8, 0, 8);
176194
});
177195
cast::transmute(ret)
178196
}

0 commit comments

Comments
 (0)