- Timestamp:
- Sep 25, 2018, 11:35:34 AM (4 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- c6bbcdb
- Parents:
- 341bb80 (diff), 7428ad9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- libcfa
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/Makefile.in
r341bb80 r6d44da1 238 238 CFLAGS = @CFLAGS@ 239 239 CONFIGURATION = @CONFIGURATION@ 240 CONFIG_BUILDLIB = @CONFIG_BUILDLIB@ 240 241 CONFIG_CFAFLAGS = @CONFIG_CFAFLAGS@ 241 242 CONFIG_CFLAGS = @CONFIG_CFLAGS@ -
libcfa/configure
r341bb80 r6d44da1 701 701 CFA_PREFIX 702 702 CFA_NAME 703 BUILDLIB_FALSE 704 BUILDLIB_TRUE 705 CONFIG_BUILDLIB 703 706 CONFIG_CFAFLAGS 704 707 CONFIG_CFLAGS … … 2376 2379 2377 2380 2381 2378 2382 am__api_version='1.15' 2379 2383 … … 2947 2951 CONFIG_CFLAGS="-O0 -g" 2948 2952 CONFIG_CFAFLAGS="-debug" 2953 CONFIG_BUILDLIB="yes" 2949 2954 ;; 2950 2955 "nodebug" ) 2951 2956 CONFIG_CFLAGS="-O2 -s" 2952 2957 CONFIG_CFAFLAGS="-nodebug" 2958 CONFIG_BUILDLIB="yes" 2953 2959 ;; 2954 2960 "nolib" ) 2955 CONFIG_CFLAGS="" 2956 CONFIG_CFAFLAGS="" 2961 CONFIG_CFLAGS="-O2 -s" 2962 CONFIG_CFAFLAGS="-nodebug" 2963 CONFIG_BUILDLIB="no" 2957 2964 ;; 2958 2965 esac 2959 2966 2960 2967 2968 2969 2970 2971 if test "x${CONFIG_BUILDLIB}" = "xyes"; then 2972 BUILDLIB_TRUE= 2973 BUILDLIB_FALSE='#' 2974 else 2975 BUILDLIB_TRUE='#' 2976 BUILDLIB_FALSE= 2977 fi 2961 2978 2962 2979 … … 16944 16961 fi 16945 16962 16963 if test -z "${BUILDLIB_TRUE}" && test -z "${BUILDLIB_FALSE}"; then 16964 as_fn_error $? "conditional \"BUILDLIB\" was never defined. 16965 Usually this means the macro was only invoked conditionally." "$LINENO" 5 16966 fi 16946 16967 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then 16947 16968 as_fn_error $? "conditional \"AMDEP\" was never defined. -
libcfa/configure.ac
r341bb80 r6d44da1 42 42 CONFIG_CFLAGS="-O0 -g" 43 43 CONFIG_CFAFLAGS="-debug" 44 CONFIG_BUILDLIB="yes" 44 45 ;; 45 46 "nodebug" ) 46 47 CONFIG_CFLAGS="-O2 -s" 47 48 CONFIG_CFAFLAGS="-nodebug" 49 CONFIG_BUILDLIB="yes" 48 50 ;; 49 51 "nolib" ) 50 CONFIG_CFLAGS="" 51 CONFIG_CFAFLAGS="" 52 CONFIG_CFLAGS="-O2 -s" 53 CONFIG_CFAFLAGS="-nodebug" 54 CONFIG_BUILDLIB="no" 52 55 ;; 53 56 esac … … 55 58 AC_SUBST(CONFIG_CFLAGS) 56 59 AC_SUBST(CONFIG_CFAFLAGS) 60 AC_SUBST(CONFIG_BUILDLIB) 61 62 AM_CONDITIONAL([BUILDLIB], [test "x${CONFIG_BUILDLIB}" = "xyes"]) 57 63 58 64 #============================================================================== -
libcfa/prelude/Makefile.am
r341bb80 r6d44da1 21 21 # put into lib for now 22 22 cfalibdir = ${CFA_LIBDIR} 23 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c 24 noinst_DATA = ../src/prelude.c 23 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cfa bootloader.c 25 24 26 25 CC = @CFACC@ … … 45 44 ${AM_V_GEN}gcc -I${srcdir} -E ${srcdir}/prototypes.c | awk -f ${srcdir}/prototypes.awk > $@ 46 45 47 prelude.cf : prelude-gen.cc46 prelude.cfa : prelude-gen.cc 48 47 ${AM_V_GEN}${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} ${AM_CFLAGS} ${<} -o prelude-gen -Wall -Wextra -O2 -g -std=c++14 49 48 @./prelude-gen > $@ … … 61 60 include $(DEPDIR)/builtins.Po 62 61 63 ../src/prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 64 ${AM_V_GEN}@CFACPP@ --prelude-dir=${builddir} -l prelude.cf $@ # use src/cfa-cpp as not in lib until after install 65 66 bootloader.c : ${srcdir}/bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 62 bootloader.c : ${srcdir}/bootloader.cf prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 67 63 ${AM_V_GEN}@CFACPP@ --prelude-dir=${builddir} -tpm ${srcdir}/bootloader.cf $@ # use src/cfa-cpp as not in lib until after install 68 64 … … 70 66 rm -rf $(DEPDIR) 71 67 72 MOSTLYCLEANFILES = bootloader.c builtins.cf extras.cf gcc-builtins.c gcc-builtins.cf prelude.cf 68 MOSTLYCLEANFILES = bootloader.c builtins.cf extras.cf gcc-builtins.c gcc-builtins.cf prelude.cfa 73 69 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}} -
libcfa/prelude/Makefile.in
r341bb80 r6d44da1 153 153 } 154 154 am__installdirs = "$(DESTDIR)$(cfalibdir)" 155 DATA = $(cfalib_DATA) $(noinst_DATA)155 DATA = $(cfalib_DATA) 156 156 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 157 157 am__DIST_COMMON = $(srcdir)/Makefile.in … … 181 181 CFLAGS = @CFLAGS@ 182 182 CONFIGURATION = @CONFIGURATION@ 183 CONFIG_BUILDLIB = @CONFIG_BUILDLIB@ 183 184 CONFIG_CFAFLAGS = @CONFIG_CFAFLAGS@ 184 185 CONFIG_CFLAGS = @CONFIG_CFLAGS@ … … 301 302 # put into lib for now 302 303 cfalibdir = ${CFA_LIBDIR} 304 <<<<<<< HEAD 303 305 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c 304 306 noinst_DATA = ../src/prelude.c 305 307 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 308 ======= 309 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cfa bootloader.c 310 AM_CFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ 311 >>>>>>> master 306 312 AM_CFAFLAGS = @CONFIG_CFAFLAGS@ 307 MOSTLYCLEANFILES = bootloader.c builtins.cf extras.cf gcc-builtins.c gcc-builtins.cf prelude.cf 313 MOSTLYCLEANFILES = bootloader.c builtins.cf extras.cf gcc-builtins.c gcc-builtins.cf prelude.cfa 308 314 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}} 309 315 all: all-am … … 544 550 ${AM_V_GEN}gcc -I${srcdir} -E ${srcdir}/prototypes.c | awk -f ${srcdir}/prototypes.awk > $@ 545 551 546 prelude.cf : prelude-gen.cc552 prelude.cfa : prelude-gen.cc 547 553 ${AM_V_GEN}${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} ${AM_CFLAGS} ${<} -o prelude-gen -Wall -Wextra -O2 -g -std=c++14 548 554 @./prelude-gen > $@ … … 560 566 include $(DEPDIR)/builtins.Po 561 567 562 ../src/prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 563 ${AM_V_GEN}@CFACPP@ --prelude-dir=${builddir} -l prelude.cf $@ # use src/cfa-cpp as not in lib until after install 564 565 bootloader.c : ${srcdir}/bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 568 bootloader.c : ${srcdir}/bootloader.cf prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACPP@ 566 569 ${AM_V_GEN}@CFACPP@ --prelude-dir=${builddir} -tpm ${srcdir}/bootloader.cf $@ # use src/cfa-cpp as not in lib until after install 567 570 -
libcfa/prelude/prelude-gen.cc
r341bb80 r6d44da1 142 142 143 143 int main() { 144 cout << "# 2 \"prelude.cf \" // needed for error messages from this file" << endl;144 cout << "# 2 \"prelude.cfa\" // needed for error messages from this file" << endl; 145 145 cout << "trait sized(dtype T) {};" << endl; 146 146 -
libcfa/src/Makefile.am
r341bb80 r6d44da1 25 25 lib_LTLIBRARIES = libcfa.la 26 26 27 VPATH += :../prelude 28 27 29 # AM_CFLAGS for all cfa source 28 30 # AM_CFAFLAGS for only cfa source 29 31 # use -no-include-stdhdr to prevent rebuild cycles 30 32 # The built sources must not depend on the installed headers 31 AM_CFAFLAGS = -quiet -in-tree - imacros prelude.c -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@33 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@ 32 34 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 33 35 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ … … 35 37 36 38 #---------------------------------------------------------------------------------------------------------------- 39 if BUILDLIB 37 40 headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \ 38 41 containers/maybe.hfa containers/pair.hfa containers/result.hfa containers/vector.hfa 42 43 headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa 39 44 40 45 # not all platforms support concurrency, add option do disable it 41 46 headers += concurrency/coroutine.hfa concurrency/thread.hfa concurrency/kernel.hfa concurrency/monitor.hfa concurrency/mutex.hfa 42 47 48 headers_nosrc += concurrency/invoke.h 49 43 50 libobjs = ${headers:.hfa=.lo} 44 libsrc = prelude.c startup.cfa interpose.cfa bits/debug.cfa assert.cfa exception.c virtual.c heap.cfa \ 45 ${headers:.hfa=.cfa} 51 libsrc = startup.cfa interpose.cfa bits/debug.cfa assert.cfa exception.c virtual.c heap.cfa ${headers:.hfa=.cfa} 46 52 47 53 # not all platforms support concurrency, add option do disable it 48 54 libsrc += concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa concurrency/invoke.c concurrency/preemption.cfa 55 else 56 headers = 57 headers_nosrc = 58 libsrc = 59 endif 60 49 61 50 62 #---------------------------------------------------------------------------------------------------------------- 51 63 # add dependency to cfa-cpp so all libraries are rebuilt with new translator 52 ${libobjs} : ${cfalib_DATA} 64 #@CFACC@ @CFACPP@ prelude.cfa 53 65 54 libcfa_la_SOURCES = ${libsrc} 66 # add dependency of cfa files 67 libobjs = $(addsuffix .lo, $(basename $(filter %.cfa,$(libsrc)))) 68 $(libobjs) : @CFACC@ @CFACPP@ prelude.cfa 69 70 71 # .deps inclusion is not done automatically by automake for new languages 72 libdeps = $(join \ 73 $(addsuffix $(DEPDIR)/ , $(dir $(libobjs) ) ), \ 74 $(notdir ${libobjs:.lo=.Po}) \ 75 ) 76 77 -include $(libdeps) 78 79 prelude.lo : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@ 80 ${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@} 81 82 83 84 #---------------------------------------------------------------------------------------------------------------- 85 libcfa_la_SOURCES = prelude.cfa ${libsrc} 55 86 56 87 stdhdr = $(shell find $(srcdir)/stdhdr -type f -printf "%p ") 57 88 58 89 cfa_includedir = $(CFA_INCDIR) 59 nobase_cfa_include_HEADERS = \ 60 ${headers} \ 61 ${stdhdr} \ 62 math.hfa \ 63 gmp.hfa \ 64 time_t.hfa \ 65 bits/align.hfa \ 66 bits/containers.hfa \ 67 bits/defs.hfa \ 68 bits/debug.hfa \ 69 bits/locks.hfa \ 70 concurrency/invoke.h 71 72 MOSTLYCLEANFILES = prelude.c 90 nobase_cfa_include_HEADERS = ${stdhdr} ${headers} ${headers_nosrc} 73 91 74 92 #---------------------------------------------------------------------------------------------------------------- 75 93 maintainer-clean-local: 76 94 -rm -rf ${CFA_INCDIR} ${CFA_LIBDIR} 95 96 97 # $(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ 98 # $(CFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ 99 # $(am__mv) $$depbase.Tpo $$depbase.Po -
libcfa/src/Makefile.in
r341bb80 r6d44da1 19 19 20 20 21 VPATH = @srcdir@22 21 am__is_gnu_make = { \ 23 22 if test -z '$(MAKELEVEL)'; then \ … … 103 102 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 104 103 $(ACLOCAL_M4) 105 DIST_COMMON = $(srcdir)/Makefile.am $(nobase_cfa_include_HEADERS)\106 $(am__ DIST_COMMON)104 DIST_COMMON = $(srcdir)/Makefile.am \ 105 $(am__nobase_cfa_include_HEADERS_DIST) $(am__DIST_COMMON) 107 106 mkinstalldirs = $(install_sh) -d 108 107 CONFIG_CLEAN_FILES = … … 136 135 } 137 136 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cfa_includedir)" 137 <<<<<<< HEAD 138 138 LTLIBRARIES = $(lib_LTLIBRARIES) 139 139 libcfa_la_LIBADD = … … 155 155 am__v_lt_0 = --silent 156 156 am__v_lt_1 = 157 ======= 158 LIBRARIES = $(lib_LIBRARIES) 159 AR = ar 160 AM_V_AR = $(am__v_AR_@AM_V@) 161 am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) 162 am__v_AR_0 = @echo " AR " $@; 163 am__v_AR_1 = 164 libcfa_a_AR = $(AR) $(ARFLAGS) 165 libcfa_a_LIBADD = 166 am__libcfa_a_SOURCES_DIST = prelude.cfa startup.cfa interpose.cfa \ 167 bits/debug.cfa assert.cfa exception.c virtual.c heap.cfa \ 168 fstream.cfa iostream.cfa iterator.cfa limits.cfa rational.cfa \ 169 time.cfa stdlib.cfa common.cfa containers/maybe.cfa \ 170 containers/pair.cfa containers/result.cfa \ 171 containers/vector.cfa concurrency/coroutine.cfa \ 172 concurrency/thread.cfa concurrency/kernel.cfa \ 173 concurrency/monitor.cfa concurrency/mutex.cfa \ 174 concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa \ 175 concurrency/invoke.c concurrency/preemption.cfa 176 am__dirstamp = $(am__leading_dot)dirstamp 177 @BUILDLIB_TRUE@am__objects_1 = fstream.$(OBJEXT) iostream.$(OBJEXT) \ 178 @BUILDLIB_TRUE@ iterator.$(OBJEXT) limits.$(OBJEXT) \ 179 @BUILDLIB_TRUE@ rational.$(OBJEXT) time.$(OBJEXT) \ 180 @BUILDLIB_TRUE@ stdlib.$(OBJEXT) common.$(OBJEXT) \ 181 @BUILDLIB_TRUE@ containers/maybe.$(OBJEXT) \ 182 @BUILDLIB_TRUE@ containers/pair.$(OBJEXT) \ 183 @BUILDLIB_TRUE@ containers/result.$(OBJEXT) \ 184 @BUILDLIB_TRUE@ containers/vector.$(OBJEXT) \ 185 @BUILDLIB_TRUE@ concurrency/coroutine.$(OBJEXT) \ 186 @BUILDLIB_TRUE@ concurrency/thread.$(OBJEXT) \ 187 @BUILDLIB_TRUE@ concurrency/kernel.$(OBJEXT) \ 188 @BUILDLIB_TRUE@ concurrency/monitor.$(OBJEXT) \ 189 @BUILDLIB_TRUE@ concurrency/mutex.$(OBJEXT) 190 @BUILDLIB_TRUE@am__objects_2 = startup.$(OBJEXT) interpose.$(OBJEXT) \ 191 @BUILDLIB_TRUE@ bits/debug.$(OBJEXT) assert.$(OBJEXT) \ 192 @BUILDLIB_TRUE@ exception.$(OBJEXT) virtual.$(OBJEXT) \ 193 @BUILDLIB_TRUE@ heap.$(OBJEXT) $(am__objects_1) \ 194 @BUILDLIB_TRUE@ concurrency/CtxSwitch-@ARCHITECTURE@.$(OBJEXT) \ 195 @BUILDLIB_TRUE@ concurrency/alarm.$(OBJEXT) \ 196 @BUILDLIB_TRUE@ concurrency/invoke.$(OBJEXT) \ 197 @BUILDLIB_TRUE@ concurrency/preemption.$(OBJEXT) 198 am_libcfa_a_OBJECTS = prelude.$(OBJEXT) $(am__objects_2) 199 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) 200 >>>>>>> master 157 201 AM_V_P = $(am__v_P_@AM_V@) 158 202 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) … … 199 243 am__v_CCLD_0 = @echo " CCLD " $@; 200 244 am__v_CCLD_1 = 245 <<<<<<< HEAD 201 246 SOURCES = $(libcfa_la_SOURCES) 202 247 DIST_SOURCES = $(libcfa_la_SOURCES) 248 ======= 249 SOURCES = $(libcfa_a_SOURCES) 250 DIST_SOURCES = $(am__libcfa_a_SOURCES_DIST) 251 >>>>>>> master 203 252 am__can_run_installinfo = \ 204 253 case $$AM_UPDATE_INFO_DIR in \ … … 206 255 *) (install-info --version) >/dev/null 2>&1;; \ 207 256 esac 257 am__nobase_cfa_include_HEADERS_DIST = ${shell find ${srcdir}/stdhdr \ 258 -type f -printf "%p "} fstream.hfa iostream.hfa iterator.hfa \ 259 limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \ 260 containers/maybe.hfa containers/pair.hfa containers/result.hfa \ 261 containers/vector.hfa concurrency/coroutine.hfa \ 262 concurrency/thread.hfa concurrency/kernel.hfa \ 263 concurrency/monitor.hfa concurrency/mutex.hfa math.hfa gmp.hfa \ 264 time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa \ 265 bits/debug.hfa bits/locks.hfa concurrency/invoke.h 208 266 HEADERS = $(nobase_cfa_include_HEADERS) 209 267 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) … … 229 287 $(top_srcdir)/automake/depcomp 230 288 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 289 VPATH = @srcdir@ :../prelude 231 290 ACLOCAL = @ACLOCAL@ 232 291 AMTAR = @AMTAR@ … … 253 312 CFLAGS = @CFLAGS@ 254 313 CONFIGURATION = @CONFIGURATION@ 314 CONFIG_BUILDLIB = @CONFIG_BUILDLIB@ 255 315 CONFIG_CFAFLAGS = @CONFIG_CFAFLAGS@ 256 316 CONFIG_CFLAGS = @CONFIG_CFLAGS@ … … 369 429 # create object files in directory with source files 370 430 AUTOMAKE_OPTIONS = foreign subdir-objects 431 <<<<<<< HEAD 371 432 ACLOCAL_AMFLAGS = -I automake 433 ======= 434 >>>>>>> master 372 435 ARFLAGS = cr 373 436 CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS) … … 387 450 # use -no-include-stdhdr to prevent rebuild cycles 388 451 # The built sources must not depend on the installed headers 452 <<<<<<< HEAD 389 453 AM_CFAFLAGS = -quiet -in-tree -imacros prelude.c -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@ 390 454 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 455 ======= 456 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@ 457 AM_CFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ 458 >>>>>>> master 391 459 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ 460 @BUILDLIB_FALSE@headers = 392 461 393 462 #---------------------------------------------------------------------------------------------------------------- 394 463 395 464 # not all platforms support concurrency, add option do disable it 465 <<<<<<< HEAD 396 466 headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa \ 397 467 rational.hfa time.hfa stdlib.hfa common.hfa \ … … 409 479 libcfa_la_SOURCES = ${libsrc} 410 480 stdhdr = $(shell find $(srcdir)/stdhdr -type f -printf "%p ") 481 ======= 482 @BUILDLIB_TRUE@headers = fstream.hfa iostream.hfa iterator.hfa \ 483 @BUILDLIB_TRUE@ limits.hfa rational.hfa time.hfa stdlib.hfa \ 484 @BUILDLIB_TRUE@ common.hfa containers/maybe.hfa \ 485 @BUILDLIB_TRUE@ containers/pair.hfa containers/result.hfa \ 486 @BUILDLIB_TRUE@ containers/vector.hfa concurrency/coroutine.hfa \ 487 @BUILDLIB_TRUE@ concurrency/thread.hfa concurrency/kernel.hfa \ 488 @BUILDLIB_TRUE@ concurrency/monitor.hfa concurrency/mutex.hfa 489 @BUILDLIB_FALSE@headers_nosrc = 490 @BUILDLIB_TRUE@headers_nosrc = math.hfa gmp.hfa time_t.hfa \ 491 @BUILDLIB_TRUE@ bits/align.hfa bits/containers.hfa \ 492 @BUILDLIB_TRUE@ bits/defs.hfa bits/debug.hfa bits/locks.hfa \ 493 @BUILDLIB_TRUE@ concurrency/invoke.h 494 @BUILDLIB_FALSE@libsrc = 495 496 # not all platforms support concurrency, add option do disable it 497 @BUILDLIB_TRUE@libsrc = startup.cfa interpose.cfa bits/debug.cfa \ 498 @BUILDLIB_TRUE@ assert.cfa exception.c virtual.c heap.cfa \ 499 @BUILDLIB_TRUE@ ${headers:.hfa=.cfa} \ 500 @BUILDLIB_TRUE@ concurrency/CtxSwitch-@ARCHITECTURE@.S \ 501 @BUILDLIB_TRUE@ concurrency/alarm.cfa concurrency/invoke.c \ 502 @BUILDLIB_TRUE@ concurrency/preemption.cfa 503 504 #---------------------------------------------------------------------------------------------------------------- 505 # add dependency to cfa-cpp so all libraries are rebuilt with new translator 506 #@CFACC@ @CFACPP@ prelude.cfa 507 508 # add dependency of cfa files 509 libobjs = $(addsuffix .o, $(basename $(filter %.cfa,$(libsrc)))) 510 511 # .deps inclusion is not done automatically by automake for new languages 512 libdeps = $(join \ 513 $(addsuffix $(DEPDIR)/ , $(dir $(libobjs) ) ), \ 514 $(notdir ${libobjs:.o=.Po}) \ 515 ) 516 517 518 #---------------------------------------------------------------------------------------------------------------- 519 libcfa_a_SOURCES = prelude.cfa ${libsrc} 520 stdhdr = ${shell find ${srcdir}/stdhdr -type f -printf "%p "} 521 >>>>>>> master 411 522 cfa_includedir = $(CFA_INCDIR) 412 nobase_cfa_include_HEADERS = \ 413 ${headers} \ 414 ${stdhdr} \ 415 math.hfa \ 416 gmp.hfa \ 417 time_t.hfa \ 418 bits/align.hfa \ 419 bits/containers.hfa \ 420 bits/defs.hfa \ 421 bits/debug.hfa \ 422 bits/locks.hfa \ 423 concurrency/invoke.h 424 425 MOSTLYCLEANFILES = prelude.c 523 nobase_cfa_include_HEADERS = ${stdhdr} ${headers} ${headers_nosrc} 426 524 all: all-am 427 525 … … 554 652 -rm -f *.tab.c 555 653 654 <<<<<<< HEAD 556 655 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Plo@am__quote@ 557 656 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prelude.Plo@am__quote@ … … 559 658 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@ARCHITECTURE@.Plo@am__quote@ 560 659 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/invoke.Plo@am__quote@ 660 ======= 661 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Po@am__quote@ 662 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtual.Po@am__quote@ 663 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@ARCHITECTURE@.Po@am__quote@ 664 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/invoke.Po@am__quote@ 665 >>>>>>> master 561 666 562 667 .S.o: … … 750 855 fi 751 856 mostlyclean-generic: 752 -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)753 857 754 858 clean-generic: … … 861 965 862 966 863 .cfa.o: $(CFACC) $(CFACPP)967 .cfa.o: 864 968 $(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ 865 969 $(CFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ 866 970 $(am__mv) $$depbase.Tpo $$depbase.Po 867 971 $(libobjs) : @CFACC@ @CFACPP@ prelude.cfa 972 973 <<<<<<< HEAD 868 974 .cfa.lo: 869 975 $(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ … … 874 980 # add dependency to cfa-cpp so all libraries are rebuilt with new translator 875 981 ${libobjs} : ${cfalib_DATA} 982 ======= 983 -include $(libdeps) 984 985 prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@ 986 ${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@} 987 >>>>>>> master 876 988 877 989 #---------------------------------------------------------------------------------------------------------------- … … 879 991 -rm -rf ${CFA_INCDIR} ${CFA_LIBDIR} 880 992 993 # $(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ 994 # $(CFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ 995 # $(am__mv) $$depbase.Tpo $$depbase.Po 996 881 997 # Tell versions [3.59,3.63) of GNU make to not export all variables. 882 998 # Otherwise a system limit (for SysV at least) may be exceeded. -
libcfa/src/heap.cfa
r341bb80 r6d44da1 1 // #comment TD : this file uses both spaces and tabs for indentation2 3 1 // 4 2 // Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo … … 12 10 // Created On : Tue Dec 19 21:58:35 2017 13 11 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Sat Aug 11 08:22:16201815 // Update Count : 49512 // Last Modified On : Thu Sep 6 09:01:30 2018 13 // Update Count : 513 16 14 // 17 15 … … 25 23 26 24 // #comment TD : Many of these should be merged into math I believe 27 #include "bits/align.hfa" 28 #include "bits/defs.hfa" 29 #include "bits/locks.hfa" 25 #include "bits/align.hfa" // libPow2 26 #include "bits/defs.hfa" // likely, unlikely 27 #include "bits/locks.hfa" // __spinlock_t 30 28 #include "startup.hfa" // STARTUP_PRIORITY_MEMORY 31 #include "stdlib.hfa" 29 #include "stdlib.hfa" // bsearchl 32 30 #include "malloc.h" 33 31 … … 151 149 152 150 extern "C" { 153 void heapAppStart() {// called by __cfaabi_appready_startup154 allocFree = 0;155 } // heapAppStart156 157 void heapAppStop() {// called by __cfaabi_appready_startdown158 fclose( stdin ); fclose( stdout );159 checkUnfreed();160 } // heapAppStop151 void heapAppStart() { // called by __cfaabi_appready_startup 152 allocFree = 0; 153 } // heapAppStart 154 155 void heapAppStop() { // called by __cfaabi_appready_startdown 156 fclose( stdin ); fclose( stdout ); 157 checkUnfreed(); 158 } // heapAppStop 161 159 } // extern "C" 162 160 #endif // __CFA_DEBUG__ … … 167 165 168 166 struct Storage { 169 167 struct Header { // header 170 168 union Kind { 171 169 struct RealHeader { 172 170 union { 173 // #comment TD : this code use byte size but the comment uses bit size 174 175 struct { // 32-bit word => 64-bit header, 64-bit word => 128-bit header 171 struct { // 4-byte word => 8-byte header, 8-byte word => 16-byte header 176 172 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __SIZEOF_POINTER__ == 4 177 173 uint32_t padding; // unused, force home/blocksize to overlay alignment in fake header 178 #endif // __ ORDER_BIG_ENDIAN__ && __U_WORDSIZE__ == 32174 #endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __SIZEOF_POINTER__ == 4 179 175 180 176 union { … … 189 185 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_POINTER__ == 4 190 186 uint32_t padding; // unused, force home/blocksize to overlay alignment in fake header 191 #endif // __ORDER_LITTLE_ENDIAN__ && __U_WORDSIZE__ == 32 192 187 #endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_POINTER__ == 4 193 188 }; 194 195 // #comment TD : C++ code 189 // future code 196 190 #if BUCKLOCK == LOCKFREE 197 191 Stack<Storage>::Link next; // freed block points next freed block of same size (double-wide) … … 211 205 } fake; // FakeHeader 212 206 } kind; // Kind 213 214 215 207 } header; // Header 208 char pad[ALIGN - sizeof( Header )]; 209 char data[0]; // storage 216 210 }; // Storage 217 211 … … 220 214 struct FreeHeader { 221 215 #if BUCKLOCK == SPINLOCK 222 223 216 __spinlock_t lock; // must be first field for alignment 217 Storage * freeList; 224 218 #elif BUCKLOCK == LOCKFREE 225 // #comment TD : C++code226 219 // future code 220 StackLF<Storage> freeList; 227 221 #else 228 222 #error undefined lock type for bucket lock 229 223 #endif // SPINLOCK 230 224 size_t blockSize; // size of allocations on this list 231 225 }; // FreeHeader 232 226 … … 249 243 static unsigned int maxBucketsUsed; // maximum number of buckets in use 250 244 251 // #comment TD : This array is not const but it feels like it should be252 245 // Powers of 2 are common allocation sizes, so make powers of 2 generate the minimum required size. 253 static unsigned int bucketSizes[NoBucketSizes] @= {// different bucket sizes246 static const unsigned int bucketSizes[NoBucketSizes] @= { // different bucket sizes 254 247 16, 32, 48, 64, 255 248 64 + sizeof(HeapManager.Storage), 96, 112, 128, 128 + sizeof(HeapManager.Storage), 160, 192, 224, … … 279 272 // #comment TD : The return type of this function should be commented 280 273 static inline bool setMmapStart( size_t value ) { 281 274 if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true; 282 275 mmapStart = value; // set global 283 276 … … 313 306 sbrk( (char *)libCeiling( (long unsigned int)End, libAlign() ) - End ); // move start of heap to multiple of alignment 314 307 heapBegin = heapEnd = sbrk( 0 ); // get new start point 315 } // HeapManager308 } // HeapManager 316 309 317 310 … … 323 316 // } // if 324 317 #endif // __STATISTICS__ 325 } // ~HeapManager318 } // ~HeapManager 326 319 327 320 … … 329 322 void memory_startup( void ) { 330 323 #ifdef __CFA_DEBUG__ 331 if ( unlikely( heapBoot ) ) { // check for recursion during system boot324 if ( unlikely( heapBoot ) ) { // check for recursion during system boot 332 325 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT. 333 326 abort( "boot() : internal error, recursively invoked during system boot." ); … … 336 329 #endif // __CFA_DEBUG__ 337 330 338 // #comment TD : This assertion seems redundent with the above code339 assert( heapManager.heapBegin == 0 );340 heapManager{};331 //assert( heapManager.heapBegin != 0 ); 332 //heapManager{}; 333 if ( heapManager.heapBegin == 0 ) heapManager{}; 341 334 } // memory_startup 342 335 … … 374 367 char helpText[512]; 375 368 __cfaabi_dbg_bits_print_buffer( helpText, sizeof(helpText), 376 "\nHeap statistics:\n"377 " malloc: calls %u / storage %llu\n"378 " calloc: calls %u / storage %llu\n"379 " memalign: calls %u / storage %llu\n"380 " cmemalign: calls %u / storage %llu\n"381 " realloc: calls %u / storage %llu\n"382 " free: calls %u / storage %llu\n"383 " mmap: calls %u / storage %llu\n"384 " munmap: calls %u / storage %llu\n"385 " sbrk: calls %u / storage %llu\n",386 malloc_calls, malloc_storage,387 calloc_calls, calloc_storage,388 memalign_calls, memalign_storage,389 cmemalign_calls, cmemalign_storage,390 realloc_calls, realloc_storage,391 free_calls, free_storage,392 mmap_calls, mmap_storage,393 munmap_calls, munmap_storage,394 sbrk_calls, sbrk_storage369 "\nHeap statistics:\n" 370 " malloc: calls %u / storage %llu\n" 371 " calloc: calls %u / storage %llu\n" 372 " memalign: calls %u / storage %llu\n" 373 " cmemalign: calls %u / storage %llu\n" 374 " realloc: calls %u / storage %llu\n" 375 " free: calls %u / storage %llu\n" 376 " mmap: calls %u / storage %llu\n" 377 " munmap: calls %u / storage %llu\n" 378 " sbrk: calls %u / storage %llu\n", 379 malloc_calls, malloc_storage, 380 calloc_calls, calloc_storage, 381 memalign_calls, memalign_storage, 382 cmemalign_calls, cmemalign_storage, 383 realloc_calls, realloc_storage, 384 free_calls, free_storage, 385 mmap_calls, mmap_storage, 386 munmap_calls, munmap_storage, 387 sbrk_calls, sbrk_storage 395 388 ); 396 389 } // printStats 397 390 398 // #comment TD : Why do we have this? 399 static int printStatsXML( FILE * stream ) { 391 static int printStatsXML( FILE * stream ) { // see malloc_info 400 392 char helpText[512]; 401 393 int len = snprintf( helpText, sizeof(helpText), … … 431 423 static inline void noMemory() { 432 424 abort( "Heap memory exhausted at %zu bytes.\n" 433 434 425 "Possible cause is very large memory allocation and/or large amount of unfreed storage allocated by the program or system/library routines.", 426 ((char *)(sbrk( 0 )) - (char *)(heapManager.heapBegin)) ); 435 427 } // noMemory 436 428 … … 444 436 445 437 static inline bool setHeapExpand( size_t value ) { 446 438 if ( heapExpand < pageSize ) return true; 447 439 heapExpand = value; 448 440 return false; … … 453 445 if ( unlikely( check ) ) { // bad address ? 454 446 abort( "Attempt to %s storage %p with address outside the heap.\n" 455 456 447 "Possible cause is duplicate free on same block or overwriting of memory.", 448 name, addr ); 457 449 } // if 458 450 } // checkHeader … … 484 476 485 477 #ifdef __CFA_DEBUG__ 486 478 checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ? 487 479 #endif // __CFA_DEBUG__ 488 480 … … 490 482 // It's called as the first statement of both branches of the last if, with the same parameters in all cases 491 483 492 493 484 // header may be safe to dereference 485 fakeHeader( header, size, alignment ); 494 486 #ifdef __CFA_DEBUG__ 495 487 checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -) 496 488 #endif // __CFA_DEBUG__ 497 489 498 490 freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3); 499 491 #ifdef __CFA_DEBUG__ 500 501 502 503 504 492 if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) { 493 abort( "Attempt to %s storage %p with corrupted header.\n" 494 "Possible cause is duplicate free on same block or overwriting of header information.", 495 name, addr ); 496 } // if 505 497 #endif // __CFA_DEBUG__ 506 507 498 size = freeElem->blockSize; 499 return false; 508 500 } // headers 509 501 … … 521 513 return 0; 522 514 } // if 523 #ifdef __STATISTICS__515 #ifdef __STATISTICS__ 524 516 sbrk_calls += 1; 525 517 sbrk_storage += increase; 526 #endif // __STATISTICS__527 #ifdef __CFA_DEBUG__518 #endif // __STATISTICS__ 519 #ifdef __CFA_DEBUG__ 528 520 // Set new memory to garbage so subsequent uninitialized usages might fail. 529 521 memset( (char *)heapEnd + heapRemaining, '\377', increase ); 530 #endif // __CFA_DEBUG__522 #endif // __CFA_DEBUG__ 531 523 rem = heapRemaining + increase - size; 532 524 } // if … … 560 552 561 553 #if defined( SPINLOCK ) 562 563 554 lock( freeElem->lock __cfaabi_dbg_ctx2 ); 555 block = freeElem->freeList; // remove node from stack 564 556 #else 565 557 block = freeElem->freeList.pop(); 566 558 #endif // SPINLOCK 567 559 if ( unlikely( block == 0 ) ) { // no free block ? … … 569 561 unlock( freeElem->lock ); 570 562 #endif // SPINLOCK 563 571 564 // Freelist for that size was empty, so carve it out of the heap if there's enough left, or get some more 572 565 // and then carve it off. 573 566 574 567 block = (HeapManager.Storage *)extend( tsize ); // mutual exclusion on call 575 568 if ( unlikely( block == 0 ) ) return 0; 576 569 #if defined( SPINLOCK ) 577 570 } else { … … 582 575 583 576 block->header.kind.real.home = freeElem; // pointer back to free list of apropriate size 584 577 } else { // large size => mmap 585 578 tsize = libCeiling( tsize, pageSize ); // must be multiple of page size 586 579 #ifdef __STATISTICS__ 587 588 580 __atomic_add_fetch( &mmap_calls, 1, __ATOMIC_SEQ_CST ); 581 __atomic_add_fetch( &mmap_storage, tsize, __ATOMIC_SEQ_CST ); 589 582 #endif // __STATISTICS__ 590 583 block = (HeapManager.Storage *)mmap( 0, tsize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, mmapFd, 0 ); … … 593 586 abort( "(HeapManager &)0x%p.doMalloc() : internal error, mmap failure, size:%zu error:%d.", &heapManager, tsize, errno ); 594 587 } // if 595 #ifdef __CFA_DEBUG__588 #ifdef __CFA_DEBUG__ 596 589 // Set new memory to garbage so subsequent uninitialized usages might fail. 597 590 memset( block, '\377', tsize ); 598 #endif // __CFA_DEBUG__591 #endif // __CFA_DEBUG__ 599 592 block->header.kind.real.blockSize = tsize; // storage size for munmap 600 601 602 593 } // if 594 595 void * area = &(block->data); // adjust off header to user bytes 603 596 604 597 #ifdef __CFA_DEBUG__ 605 606 607 608 609 610 611 612 613 598 assert( ((uintptr_t)area & (libAlign() - 1)) == 0 ); // minimum alignment ? 599 __atomic_add_fetch( &allocFree, tsize, __ATOMIC_SEQ_CST ); 600 if ( traceHeap() ) { 601 enum { BufferSize = 64 }; 602 char helpText[BufferSize]; 603 int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", area, size, tsize ); 604 // int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", area, size ); 605 __cfaabi_dbg_bits_write( helpText, len ); 606 } // if 614 607 #endif // __CFA_DEBUG__ 615 608 … … 620 613 static inline void doFree( void * addr ) with ( heapManager ) { 621 614 #ifdef __CFA_DEBUG__ 622 623 624 615 if ( unlikely( heapManager.heapBegin == 0 ) ) { 616 abort( "doFree( %p ) : internal error, called before heap is initialized.", addr ); 617 } // if 625 618 #endif // __CFA_DEBUG__ 626 619 … … 631 624 if ( headers( "free", addr, header, freeElem, size, alignment ) ) { // mmapped ? 632 625 #ifdef __STATISTICS__ 633 634 626 __atomic_add_fetch( &munmap_calls, 1, __ATOMIC_SEQ_CST ); 627 __atomic_add_fetch( &munmap_storage, size, __ATOMIC_SEQ_CST ); 635 628 #endif // __STATISTICS__ 636 629 if ( munmap( header, size ) == -1 ) { 637 630 #ifdef __CFA_DEBUG__ 638 631 abort( "Attempt to deallocate storage %p not allocated or with corrupt header.\n" 639 640 632 "Possible cause is invalid pointer.", 633 addr ); 641 634 #endif // __CFA_DEBUG__ 642 635 } // if 643 636 } else { 644 637 #ifdef __CFA_DEBUG__ 645 646 638 // Set free memory to garbage so subsequent usages might fail. 639 memset( ((HeapManager.Storage *)header)->data, '\377', freeElem->blockSize - sizeof( HeapManager.Storage ) ); 647 640 #endif // __CFA_DEBUG__ 648 641 649 642 #ifdef __STATISTICS__ 650 643 free_storage += size; 651 644 #endif // __STATISTICS__ 652 645 #if defined( SPINLOCK ) 653 654 655 656 646 lock( freeElem->lock __cfaabi_dbg_ctx2 ); // acquire spin lock 647 header->kind.real.next = freeElem->freeList; // push on stack 648 freeElem->freeList = (HeapManager.Storage *)header; 649 unlock( freeElem->lock ); // release spin lock 657 650 #else 658 651 freeElem->freeList.push( *(HeapManager.Storage *)header ); 659 652 #endif // SPINLOCK 660 653 } // if 661 654 662 655 #ifdef __CFA_DEBUG__ 663 664 665 666 667 668 656 __atomic_add_fetch( &allocFree, -size, __ATOMIC_SEQ_CST ); 657 if ( traceHeap() ) { 658 char helpText[64]; 659 int len = snprintf( helpText, sizeof(helpText), "Free( %p ) size:%zu\n", addr, size ); 660 __cfaabi_dbg_bits_write( helpText, len ); 661 } // if 669 662 #endif // __CFA_DEBUG__ 670 663 } // doFree … … 674 667 size_t total = 0; 675 668 #ifdef __STATISTICS__ 676 677 669 __cfaabi_dbg_bits_acquire(); 670 __cfaabi_dbg_bits_print_nolock( "\nBin lists (bin size : free blocks on list)\n" ); 678 671 #endif // __STATISTICS__ 679 672 for ( unsigned int i = 0; i < maxBucketsUsed; i += 1 ) { … … 695 688 696 689 #ifdef __STATISTICS__ 697 698 690 __cfaabi_dbg_bits_print_nolock( "%7zu, %-7u ", size, N ); 691 if ( (i + 1) % 8 == 0 ) __cfaabi_dbg_bits_print_nolock( "\n" ); 699 692 #endif // __STATISTICS__ 700 693 } // for 701 694 #ifdef __STATISTICS__ 702 703 695 __cfaabi_dbg_bits_print_nolock( "\ntotal free blocks:%zu\n", total ); 696 __cfaabi_dbg_bits_release(); 704 697 #endif // __STATISTICS__ 705 698 return (char *)heapEnd - (char *)heapBegin - total; 706 699 } // checkFree 707 700 708 // #comment TD : This is not a good name, plus this feels like it could easily be folded into doMalloc 709 static inline void * malloc2( size_t size ) { // necessary for malloc statistics 710 assert( heapManager.heapBegin != 0 ); 701 702 static inline void * mallocNoStats( size_t size ) { // necessary for malloc statistics 703 //assert( heapManager.heapBegin != 0 ); 704 if ( unlikely( heapManager.heapBegin == 0 ) ) heapManager{}; // called before memory_startup ? 711 705 void * area = doMalloc( size ); 712 706 if ( unlikely( area == 0 ) ) errno = ENOMEM; // POSIX 713 707 return area; 714 } // malloc 2715 716 717 static inline void * memalign 2( size_t alignment, size_t size ) { // necessary for malloc statistics718 #ifdef __CFA_DEBUG__708 } // mallocNoStats 709 710 711 static inline void * memalignNoStats( size_t alignment, size_t size ) { // necessary for malloc statistics 712 #ifdef __CFA_DEBUG__ 719 713 checkAlign( alignment ); // check alignment 720 #endif // __CFA_DEBUG__714 #endif // __CFA_DEBUG__ 721 715 722 716 // if alignment <= default alignment, do normal malloc as two headers are unnecessary 723 if ( unlikely( alignment <= libAlign() ) ) return malloc2( size );717 if ( unlikely( alignment <= libAlign() ) ) return mallocNoStats( size ); 724 718 725 719 // Allocate enough storage to guarantee an address on the alignment boundary, and sufficient space before it for … … 732 726 // subtract libAlign() because it is already the minimum alignment 733 727 // add sizeof(Storage) for fake header 734 // #comment TD : this is the only place that calls doMalloc without calling malloc 2, why ?728 // #comment TD : this is the only place that calls doMalloc without calling mallocNoStats, why ? 735 729 char * area = (char *)doMalloc( size + alignment - libAlign() + sizeof(HeapManager.Storage) ); 736 730 if ( unlikely( area == 0 ) ) return area; 737 731 738 732 // address in the block of the "next" alignment address … … 749 743 750 744 return user; 751 } // memalign 2745 } // memalignNoStats 752 746 753 747 754 748 extern "C" { 755 // The malloc() function allocates size bytes and returns a pointer to the 756 // allocated memory. The memory is not initialized. If size is 0, then malloc() 757 // returns either NULL, or a unique pointer value that can later be successfully 758 // passed to free(). 749 // The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not 750 // initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be 751 // successfully passed to free(). 759 752 void * malloc( size_t size ) { 760 753 #ifdef __STATISTICS__ 761 __atomic_add_fetch( &malloc_calls, 1, __ATOMIC_SEQ_CST ); 762 __atomic_add_fetch( &malloc_storage, size, __ATOMIC_SEQ_CST ); 763 #endif // __STATISTICS__ 764 765 return malloc2( size ); 766 } // malloc 767 768 // The calloc() function allocates memory for an array of nmemb elements of 769 // size bytes each and returns a pointer to the allocated memory. The memory 770 // is set to zero. If nmemb or size is 0, then calloc() returns either NULL, 771 // or a unique pointer value that can later be successfully passed to free(). 772 void * calloc( size_t noOfElems, size_t elemSize ) { 754 __atomic_add_fetch( &malloc_calls, 1, __ATOMIC_SEQ_CST ); 755 __atomic_add_fetch( &malloc_storage, size, __ATOMIC_SEQ_CST ); 756 #endif // __STATISTICS__ 757 758 return mallocNoStats( size ); 759 } // malloc 760 761 // The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to 762 // the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a 763 // unique pointer value that can later be successfully passed to free(). 764 void * calloc( size_t noOfElems, size_t elemSize ) { 773 765 size_t size = noOfElems * elemSize; 774 766 #ifdef __STATISTICS__ 775 776 777 #endif // __STATISTICS__ 778 779 char * area = (char *)malloc 2( size );780 767 __atomic_add_fetch( &calloc_calls, 1, __ATOMIC_SEQ_CST ); 768 __atomic_add_fetch( &calloc_storage, size, __ATOMIC_SEQ_CST ); 769 #endif // __STATISTICS__ 770 771 char * area = (char *)mallocNoStats( size ); 772 if ( unlikely( area == 0 ) ) return 0; 781 773 782 774 HeapManager.Storage.Header * header; … … 790 782 memset( area, '\0', asize - sizeof(HeapManager.Storage) ); // set to zeros 791 783 792 header->kind.real.blockSize |= 2; // mark as zero filled784 header->kind.real.blockSize |= 2; // mark as zero filled 793 785 return area; 794 786 } // calloc 795 787 796 788 // #comment TD : Document this function … … 798 790 size_t size = noOfElems * elemSize; 799 791 #ifdef __STATISTICS__ 800 801 802 #endif // __STATISTICS__ 803 804 char * area = (char *)memalign 2( alignment, size );805 792 __atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST ); 793 __atomic_add_fetch( &cmemalign_storage, size, __ATOMIC_SEQ_CST ); 794 #endif // __STATISTICS__ 795 796 char * area = (char *)memalignNoStats( alignment, size ); 797 if ( unlikely( area == 0 ) ) return 0; 806 798 HeapManager.Storage.Header * header; 807 799 HeapManager.FreeHeader * freeElem; … … 811 803 // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero. 812 804 if ( ! mapped ) 813 #endif // __CFA_DEBUG__805 #endif // __CFA_DEBUG__ 814 806 memset( area, '\0', asize - ( (char *)area - (char *)header ) ); // set to zeros 815 807 header->kind.real.blockSize |= 2; // mark as zero filled 816 808 817 809 return area; 818 } // cmemalign 819 820 // The realloc() function changes the size of the memory block pointed to by 821 // ptr to size bytes. The contents will be unchanged in the range from the 822 // start of the region up to the minimum of the old and new sizes. If the new 823 // size is larger than the old size, the added memory will not be initialized. 824 // If ptr is NULL, then the call is equivalent to malloc(size), for all values 825 // of size; if size is equal to zero, and ptr is not NULL, then the call is 826 // equivalent to free(ptr). Unless ptr is NULL, it must have been returned by 827 // an earlier call to malloc(), calloc() or realloc(). If the area pointed to 828 // was moved, a free(ptr) is done. 829 void * realloc( void * addr, size_t size ) { 830 #ifdef __STATISTICS__ 831 __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST ); 832 #endif // __STATISTICS__ 833 834 if ( unlikely( addr == 0 ) ) return malloc2( size ); // special cases 835 if ( unlikely( size == 0 ) ) { free( addr ); return 0; } 810 } // cmemalign 811 812 // The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be 813 // unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size 814 // is larger than the old size, the added memory will not be initialized. If ptr is NULL, then the call is 815 // equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call 816 // is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(), 817 // calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done. 818 void * realloc( void * addr, size_t size ) { 819 #ifdef __STATISTICS__ 820 __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST ); 821 #endif // __STATISTICS__ 822 823 if ( unlikely( addr == 0 ) ) return mallocNoStats( size ); // special cases 824 if ( unlikely( size == 0 ) ) { free( addr ); return 0; } 836 825 837 826 HeapManager.Storage.Header * header; … … 848 837 849 838 #ifdef __STATISTICS__ 850 839 __atomic_add_fetch( &realloc_storage, size, __ATOMIC_SEQ_CST ); 851 840 #endif // __STATISTICS__ 852 841 … … 855 844 area = memalign( alignment, size ); // create new area 856 845 } else { 857 area = malloc 2( size );// create new area846 area = mallocNoStats( size ); // create new area 858 847 } // if 859 848 if ( unlikely( area == 0 ) ) return 0; 860 849 if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill (calloc/cmemalign) ? 861 850 assert( (header->kind.real.blockSize & 1) == 0 ); … … 864 853 // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero. 865 854 if ( ! mapped ) 866 #endif // __CFA_DEBUG__855 #endif // __CFA_DEBUG__ 867 856 memset( (char *)area + usize, '\0', asize - ( (char *)area - (char *)header ) - usize ); // zero-fill back part 868 857 header->kind.real.blockSize |= 2; // mark new request as zero fill … … 874 863 875 864 876 // The obsolete function memalign() allocates size bytes and returns 877 // a pointer to the allocated memory. The memory address will be a 878 // multiple of alignment, which must be a power of two. 879 void * memalign( size_t alignment, size_t size ) __attribute__ ((deprecated)); 880 void * memalign( size_t alignment, size_t size ) { 865 // The obsolete function memalign() allocates size bytes and returns a pointer to the allocated memory. The memory 866 // address will be a multiple of alignment, which must be a power of two. 867 void * memalign( size_t alignment, size_t size ) { 881 868 #ifdef __STATISTICS__ 882 869 __atomic_add_fetch( &memalign_calls, 1, __ATOMIC_SEQ_CST ); … … 884 871 #endif // __STATISTICS__ 885 872 886 void * area = memalign 2( alignment, size );873 void * area = memalignNoStats( alignment, size ); 887 874 888 875 return area; 889 890 891 // The function aligned_alloc() is the same as memalign(), except for 892 // the added restriction that size should be amultiple of alignment.876 } // memalign 877 878 // The function aligned_alloc() is the same as memalign(), except for the added restriction that size should be a 879 // multiple of alignment. 893 880 void * aligned_alloc( size_t alignment, size_t size ) { 894 881 return memalign( alignment, size ); … … 896 883 897 884 898 // The function posix_memalign() allocates size bytes and places the address 899 // of the allocated memory in *memptr. The address of the allocated memory 900 // will be a multiple of alignment, which must be a power of two and a multiple 901 // of sizeof(void *). If size is 0, then posix_memalign() returns either NULL, 902 // or a unique pointer value that can later be successfully passed to free(3). 885 // The function posix_memalign() allocates size bytes and places the address of the allocated memory in *memptr. The 886 // address of the allocated memory will be a multiple of alignment, which must be a power of two and a multiple of 887 // sizeof(void *). If size is 0, then posix_memalign() returns either NULL, or a unique pointer value that can later 888 // be successfully passed to free(3). 903 889 int posix_memalign( void ** memptr, size_t alignment, size_t size ) { 904 890 if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) return EINVAL; // check alignment 905 891 * memptr = memalign( alignment, size ); 906 892 if ( unlikely( * memptr == 0 ) ) return ENOMEM; 907 893 return 0; 908 894 } // posix_memalign 909 895 910 // The obsolete function valloc() allocates size bytes and returns a pointer 911 // to the allocated memory. The memory address will be a multiple of the page size. 912 // It is equivalent to memalign(sysconf(_SC_PAGESIZE),size). 913 void * valloc( size_t size ) __attribute__ ((deprecated)); 896 // The obsolete function valloc() allocates size bytes and returns a pointer to the allocated memory. The memory 897 // address will be a multiple of the page size. It is equivalent to memalign(sysconf(_SC_PAGESIZE),size). 914 898 void * valloc( size_t size ) { 915 899 return memalign( pageSize, size ); … … 917 901 918 902 919 // The free() function frees the memory space pointed to by ptr, which must 920 // have been returned by a previous call to malloc(), calloc() or realloc(). 921 // Otherwise, or if free(ptr) has already been called before, undefined 922 // behavior occurs. If ptr is NULL, no operation is performed. 903 // The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to 904 // malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior 905 // occurs. If ptr is NULL, no operation is performed. 923 906 void free( void * addr ) { 924 907 #ifdef __STATISTICS__ 925 908 __atomic_add_fetch( &free_calls, 1, __ATOMIC_SEQ_CST ); 926 909 #endif // __STATISTICS__ 927 910 … … 931 914 if ( unlikely( addr == 0 ) ) { // special case 932 915 #ifdef __CFA_DEBUG__ 933 934 935 936 937 916 if ( traceHeap() ) { 917 #define nullmsg "Free( 0x0 ) size:0\n" 918 // Do not debug print free( 0 ), as it can cause recursive entry from sprintf. 919 __cfaabi_dbg_bits_write( nullmsg, sizeof(nullmsg) - 1 ); 920 } // if 938 921 #endif // __CFA_DEBUG__ 939 922 return; … … 943 926 } // free 944 927 945 // The mallopt() function adjusts parameters that control the behavior of the 946 // memory-allocation functions (see malloc(3)). The param argument specifies 947 // the parameter to be modified, and value specifies the new value for that 928 // The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see 929 // malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that 948 930 // parameter. 949 931 int mallopt( int option, int value ) { 950 932 choose( option ) { 951 952 953 954 955 956 957 933 case M_TOP_PAD: 934 if ( setHeapExpand( value ) ) fallthru default; 935 case M_MMAP_THRESHOLD: 936 if ( setMmapStart( value ) ) fallthru default; 937 default: 938 // #comment TD : 1 for unsopported feels wrong 939 return 1; // success, or unsupported 958 940 } // switch 959 941 return 0; // error 960 942 } // mallopt 961 943 962 // The malloc_trim() function attempts to release free memory at the top 963 // of the heap (by calling sbrk(2) with asuitable argument).944 // The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a 945 // suitable argument). 964 946 int malloc_trim( size_t ) { 965 947 return 0; // => impossible to release memory 966 948 } // malloc_trim 967 949 968 // The malloc_usable_size() function returns the number of usable bytes in the 969 // block pointed to by ptr, a pointer to a block of memory allocated by 970 // malloc(3) or a related function. 971 size_t malloc_usable_size( void * addr ) { 972 if ( unlikely( addr == 0 ) ) return 0; // null allocation has 0 size 950 // The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to 951 // a block of memory allocated by malloc(3) or a related function. 952 size_t malloc_usable_size( void * addr ) { 953 if ( unlikely( addr == 0 ) ) return 0; // null allocation has 0 size 973 954 974 955 HeapManager.Storage.Header * header; … … 982 963 983 964 984 // #comment TD : Document this function 965 // The malloc_alignment() function returns the alignment of the allocation. 985 966 size_t malloc_alignment( void * addr ) { 986 967 if ( unlikely( addr == 0 ) ) return libAlign(); // minimum alignment 987 968 HeapManager.Storage.Header * header = (HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ); 988 969 if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ? … … 991 972 return libAlign (); // minimum alignment 992 973 } // if 993 994 995 996 // #comment TD : Document this function 974 } // malloc_alignment 975 976 977 // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc(). 997 978 bool malloc_zero_fill( void * addr ) { 998 979 if ( unlikely( addr == 0 ) ) return false; // null allocation is not zero fill 999 980 1000 981 HeapManager.Storage.Header * header = (HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ); … … 1003 984 } // if 1004 985 return (header->kind.real.blockSize & 2) != 0; // zero filled (calloc/cmemalign) ? 1005 } // malloc_zero_fill 1006 1007 1008 // #comment TD : Document this function 986 } // malloc_zero_fill 987 988 989 // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and 990 // related functions. 1009 991 void malloc_stats( void ) { 1010 992 #ifdef __STATISTICS__ 1011 1012 1013 #endif // __STATISTICS__ 1014 1015 1016 // #comment TD : Document this function1017 1018 #ifdef __STATISTICS__ 1019 1020 1021 993 printStats(); 994 if ( checkFree() ) checkFree( heapManager ); 995 #endif // __STATISTICS__ 996 } // malloc_stats 997 998 // The malloc_stats_fd() function changes the file descripter where malloc_stats() writes the statistics. 999 int malloc_stats_fd( int fd ) { 1000 #ifdef __STATISTICS__ 1001 int temp = statfd; 1002 statfd = fd; 1003 return temp; 1022 1004 #else 1023 return -1; 1024 #endif // __STATISTICS__ 1025 } // malloc_stats_fd 1026 1027 1028 // #comment TD : Document this function 1005 return -1; 1006 #endif // __STATISTICS__ 1007 } // malloc_stats_fd 1008 1009 // The malloc_info() function exports an XML string that describes the current state of the memory-allocation 1010 // implementation in the caller. The string is printed on the file stream stream. The exported string includes 1011 // information about all arenas (see malloc(3)). 1029 1012 int malloc_info( int options, FILE * stream ) { 1030 1013 return printStatsXML( stream ); … … 1032 1015 1033 1016 1034 // #comment TD : What are these two functions for? 1017 // The malloc_get_state() function records the current state of all malloc(3) internal bookkeeping variables (but 1018 // not the actual contents of the heap or the state of malloc_hook(3) functions pointers). The state is recorded in 1019 // a system-dependent opaque data structure dynamically allocated via malloc(3), and a pointer to that data 1020 // structure is returned as the function result. (It is the caller's responsibility to free(3) this memory.) 1035 1021 void * malloc_get_state( void ) { 1036 return 0; 1022 return 0; // unsupported 1037 1023 } // malloc_get_state 1038 1024 1025 1026 // The malloc_set_state() function restores the state of all malloc(3) internal bookkeeping variables to the values 1027 // recorded in the opaque data structure pointed to by state. 1039 1028 int malloc_set_state( void * ptr ) { 1040 return 0; 1029 return 0; // unsupported 1041 1030 } // malloc_set_state 1042 1031 } // extern "C"
Note: See TracChangeset
for help on using the changeset viewer.