#
# Copyright (c) 1999, 2013, 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
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#  
#


# Rules for building adlc.exe

# Need exception handling support here
# $(MS_RUNTIME_OPTION) ( with /D_STATIC_CPPLIB)
# causes adlc.exe to link with the static
# multithread Standard C++ library (libcpmt.lib) instead of
# the dynamic version (msvcprt.lib), which is not included
# in any of the free tools.
EXH_FLAGS=$(GX_OPTION) $(MS_RUNTIME_OPTION)

!ifdef ALT_ADLC_PATH
ADLC=$(ALT_ADLC_PATH)\adlc.exe
!else
ADLC=adlc
!endif

!ifdef LP64
ADLCFLAGS=-q -T -D_LP64
!else
ADLCFLAGS=-q -T -U_LP64
!endif

ADLC_CXX_FLAGS=$(CXX_FLAGS) /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE

CXX_INCLUDE_DIRS=\
  /I "..\generated" \
  /I "$(WorkSpace)\src\share\vm" \
  /I "$(WorkSpace)\src\os\windows\vm" \
  /I "$(WorkSpace)\src\cpu\$(Platform_arch)\vm"

!if "$(Platform_arch_model)" == "$(Platform_arch)"
SOURCES_AD=\
  $(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad 
!else
SOURCES_AD=\
  $(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad \
  $(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch).ad 
!endif

# NOTE! If you add any files here, you must also update GENERATED_NAMES_IN_DIR
# and ProjectCreatorIDEOptions in projectcreator.make. 
GENERATED_NAMES=\
  ad_$(Platform_arch_model).cpp \
  ad_$(Platform_arch_model).hpp \
  ad_$(Platform_arch_model)_clone.cpp \
  ad_$(Platform_arch_model)_expand.cpp \
  ad_$(Platform_arch_model)_format.cpp \
  ad_$(Platform_arch_model)_gen.cpp \
  ad_$(Platform_arch_model)_misc.cpp \
  ad_$(Platform_arch_model)_peephole.cpp \
  ad_$(Platform_arch_model)_pipeline.cpp \
  adGlobals_$(Platform_arch_model).hpp \
  dfa_$(Platform_arch_model).cpp

# NOTE! This must be kept in sync with GENERATED_NAMES
GENERATED_NAMES_IN_DIR=\
  $(AdlcOutDir)\ad_$(Platform_arch_model).cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model).hpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_clone.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_expand.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_format.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_gen.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_misc.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_peephole.cpp \
  $(AdlcOutDir)\ad_$(Platform_arch_model)_pipeline.cpp \
  $(AdlcOutDir)\adGlobals_$(Platform_arch_model).hpp \
  $(AdlcOutDir)\dfa_$(Platform_arch_model).cpp

{$(WorkSpace)\src\share\vm\adlc}.cpp.obj::
        $(CXX) $(ADLC_CXX_FLAGS) $(EXH_FLAGS) $(CXX_INCLUDE_DIRS) /c $<

{$(WorkSpace)\src\share\vm\opto}.cpp.obj::
        $(CXX) $(ADLC_CXX_FLAGS) $(EXH_FLAGS) $(CXX_INCLUDE_DIRS) /c $<

adlc.exe: main.obj adlparse.obj archDesc.obj arena.obj dfa.obj dict2.obj filebuff.obj \
          forms.obj formsopt.obj formssel.obj opcodes.obj output_c.obj output_h.obj
	$(LD) $(LD_FLAGS) /subsystem:console /out:$@ $**
!if "$(MT)" != ""
# The previous link command created a .manifest file that we want to
# insert into the linked artifact so we do not need to track it
# separately.  Use ";#2" for .dll and ";#1" for .exe:
	$(MT) /manifest $@.manifest /outputresource:$@;#1
!endif

$(GENERATED_NAMES_IN_DIR): $(Platform_arch_model).ad adlc.exe
	rm -f $(GENERATED_NAMES)
	if exist $(AdlcOutDir) rmdir /s /q $(AdlcOutDir)
	mkdir $(AdlcOutDir)
	$(ADLC) $(ADLCFLAGS) $(Platform_arch_model).ad
	mv $(GENERATED_NAMES) $(AdlcOutDir)/

$(Platform_arch_model).ad: $(SOURCES_AD)
	rm -f $(Platform_arch_model).ad
	cat $(SOURCES_AD) >$(Platform_arch_model).ad
