# Copyright (C) 1996, 1997, 1998, 2001, 2002,
# 2007, 2009 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC 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 for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

LIB2FUNCS_EXTRA = $(srcdir)/config/alpha/vms-gcc_shell_handler.c

EXTRA_PARTS = vms-dwarf2.o vms-dwarf2eh.o $(VMS_EXTRA_PARTS) \
  crtbegin.o crtbeginS.o crtend.o crtendS.o

# This object must be linked with in order to make the executable debuggable.
# vms-ld handles it automatically when passed -g.
$(T)vms-dwarf2.o : $(srcdir)/config/alpha/vms-dwarf2.asm
	$(GCC_FOR_TARGET) -c -x assembler $< -o $@

$(T)vms-dwarf2eh.o : $(srcdir)/config/alpha/vms-dwarf2eh.asm
	$(GCC_FOR_TARGET) -c -x assembler $< -o $@

MULTILIB_OPTIONS = mcpu=ev6
MULTILIB_DIRNAMES = ev6
MULTILIB_OSDIRNAMES = ev6
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib

shlib_version:=$(shell echo $(BASEVER_c) | sed -e 's/\./,/' -e 's/\.//g')
SHLIB_EXT = .exe
SHLIB_OBJS = @shlib_objs@
SHLIB_NAME = @shlib_base_name@.exe
SHLIB_MULTILIB =
SHLIB_INSTALL = $(INSTALL_DATA) $(SHLIB_NAME) $$(DESTDIR)$$(libsubdir)/$(SHLIB_NAME)
SHLIB_SYMVEC = \
  grep -F -e "\$$BSS\$$" -e "\$$DATA\$$" -e " sdata " -e " data.rel " -e " data.rel.ro " -e " sbss " \
        -e "\$$LINK\$$" -e "\$$READONLY\$$" | \
  sed -e "s/.*\$$LINK\$$   \(.*\)/SYMBOL_VECTOR=(\1=PROCEDURE)/" \
      -e "s/.*\$$DATA\$$   \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.* sbss     \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.* sdata    \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.* data.rel \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.* data.rel.ro \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.*\$$BSS\$$    \(.*\)/SYMBOL_VECTOR=(\1=DATA)/" \
      -e "s/.*\$$READONLY\$$ \(.*\)/SYMBOL_VECTOR=(\1=DATA)/"
SHLIB_SYMVECX2 := $(subst $$,$$$$,$(SHLIB_SYMVEC))
SHLIB_LINK = \
  echo "case_sensitive=yes" > SYMVEC_$$$$$$$$.opt; \
  objdump --syms $(SHLIB_OBJS) | \
  $(SHLIB_SYMVECX2) >> SYMVEC_$$$$$$$$.opt ; \
  echo "case_sensitive=NO" >> SYMVEC_$$$$$$$$.opt; \
  $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -nodefaultlibs \
  -shared --for-linker=/noinform -o $(SHLIB_NAME) $(SHLIB_OBJS) \
  --for-linker=SYMVEC_$$$$$$$$.opt \
  --for-linker=gsmatch=equal,$(shlib_version)
