#!/usr/bin/env python

# RISC-V multilib list generator.
# Copyright (C) 2011-2018 Free Software Foundation, Inc.
# Contributed by Andrew Waterman (andrew@sifive.com).
# 
# 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/>.

# Each argument to this script is of the form
#  <primary arch>-<abi>-<additional arches>-<extensions>
# For example,
#  rv32imafd-ilp32d-rv32g-c,v
# means that, in addition to rv32imafd, these configurations can also use the
# rv32imafd-ilp32d libraries: rv32imafdc, rv32imafdv, rv32g, rv32gc, rv32gv

from __future__ import print_function
import sys
import collections

arches = collections.OrderedDict()
abis = collections.OrderedDict()
required = []
reuse = []

for cfg in sys.argv[1:]:
  (arch, abi, extra, ext) = cfg.split('-')
  arches[arch] = 1
  abis[abi] = 1
  extra = list(filter(None, extra.split(',')))
  ext = list(filter(None, ext.split(',')))
  alts = sum([[x] + [x + y for y in ext] for x in [arch] + extra], [])
  alts = alts + [x.replace('imafd', 'g') for x in alts if 'imafd' in x]
  for alt in alts[1:]:
    arches[alt] = 1
    reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))
  required.append('march=%s/mabi=%s' % (arch, abi))

arch_options = '/'.join(['march=%s' % x for x in arches.keys()])
arch_dirnames = ' \\\n'.join(arches.keys())

abi_options = '/'.join(['mabi=%s' % x for x in abis.keys()])
abi_dirnames = ' \\\n'.join(abis.keys())

prog = sys.argv[0].split('/')[-1]
print('# This file was generated by %s with the command:' % prog)
print('#  %s' % ' '.join(sys.argv))

print('MULTILIB_OPTIONS = %s %s' % (arch_options, abi_options))
print('MULTILIB_DIRNAMES = %s %s' % (arch_dirnames, abi_dirnames))
print('MULTILIB_REQUIRED = %s' % ' \\\n'.join(required))
print('MULTILIB_REUSE = %s' % ' \\\n'.join(reuse))
