--- old/make/hotspot/lib/CompileJvm.gmk 2018-03-05 17:41:06.000000000 +0100 +++ new/make/hotspot/lib/CompileJvm.gmk 2018-03-05 17:41:05.000000000 +0100 @@ -1,5 +1,5 @@ # -# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -270,3 +270,62 @@ include lib/JvmMapfile.gmk TARGETS += $(BUILD_LIBJVM) + +################################################################################ +# Hotspot disallows the use of global operators 'new' and 'delete'. This build +# time check helps enforce this requirement. If you trigger this check and the +# reference is not obvious from the source, GNU objdump can be used to help find +# the reference if compiled with GCC: +# +# objdump -lrdSC +# +# -C demangle +# -d disassemble +# -r print relocation entries, interspersed with the disassembly +# -S print source code, intermixed with disassembly +# -l include filenames and line numbers +# +# Search the output for the operator(s) of interest, to see where they are +# referenced. + +ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang solstudio), ) + + DEMANGLED_REGEXP := [^:]operator (new|delete) + + # Running c++filt to find offending symbols in all files is too expensive, + # especially on Solaris, so use mangled names when looking for symbols. + # Save the demangling for when something is actually found. + ifeq ($(TOOLCHAIN_TYPE), solstudio) + MANGLED_SYMS := \ + __1c2n6FL_pv_ \ + __1c2N6FL_pv_ \ + __1c2k6Fpv_v_ \ + __1c2K6Fpv_v_ \ + # + UNDEF_PATTERN := UNDEF + else + MANGLED_SYMS := \ + _ZdaPv \ + _ZdlPv \ + _Znam \ + _Znwm \ + # + UNDEF_PATTERN := ' U ' + endif + + define SetupOperatorNewDeleteCheck + $1.op_check: $1 + if [ -n "`$(NM) $$< | $(GREP) $(addprefix -e , $(MANGLED_SYMS)) \ + | $(GREP) $(UNDEF_PATTERN)`" ]; then \ + $(ECHO) "$$<: Error: Use of global operators new and delete is not allowed in Hotspot:"; \ + $(NM) $$< | $(CXXFILT) | $(EGREP) '$(DEMANGLED_REGEXP)' | $(GREP) $(UNDEF_PATTERN); \ + $(ECHO) "See: $(TOPDIR)/make/hotspot/lib/CompileJvm.gmk"; \ + exit 1; \ + fi + $(TOUCH) $$@ + + TARGETS += $1.op_check + endef + + $(foreach o, $(BUILD_LIBJVM_ALL_OBJS), $(eval $(call SetupOperatorNewDeleteCheck,$o))) +endif