--- old/make/hotspot/lib/CompileJvm.gmk 2018-02-20 18:43:52.300641186 +0100 +++ new/make/hotspot/lib/CompileJvm.gmk 2018-02-20 18:43:51.992630230 +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,40 @@ 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: +# +# 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), ) + + OP_REGEXP := \*UND\*.*[^:]operator (new|delete) + + define SetupOperatorNewDeleteCheck + $1.op_check: $1 + if [ -n "`$(OBJDUMP) -t $$< | $(CXXFILT) | $(EGREP) '$(OP_REGEXP)'`" ]; then \ + $(ECHO) "$$<: Error: Use of global operators new and delete is not allowed in Hotspot:"; \ + $(OBJDUMP) -t $$< | $(CXXFILT) | $(EGREP) '$(OP_REGEXP)'; \ + $(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