Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/declare/call.c
Key:
    Removed line
    Added line
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation.
//
// This program 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
// version 2 along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

/*
abstract
  text "Declares the various calling conventions used by the OS and the compiler."
doc
  text "Since Pliant is a true compiler, it needs to know how to generate the code for passing parameters to the function to be called. "
  text "The calling convention is surprisingly not processor related but rather C compiler and OS related."
  para
    text "The declarations starting by 'pliant_' are defining the calling convention used at C compiler level and for Pliant functions. It must match the C compiler options you selected in the make script.[lf]"
    text "The declarations starting by 'external_' are defining the standard calling convention for functions in the target operating system: the ones you call in external DLLs."
    text "Under Linux, the declarations starting by 'kernel_' are describing the calling convention for kernel functions."
  para
    text "There are two different calling conventions (excluding the kernel one) because under Linux, the standard calling convention is not the most efficient one."
  bold
    text "This file has to be updated if you change of compiler, OS, processor, or simply change some compiler flags."
*/


#if defined(_REGISTERS_) && defined(_GCC_) && defined(_i386_)
  static Int pliant_call_registers[3] = {Register_EAX,Register_EDX,Register_ECX};
  static Int pliant_modify_registers[3] = {Register_EAX,Register_EDX,Register_ECX};
  static Int pliant_return_registers[1] = {Register_EAX};
  static struct CompilingRules compiler_rules = {
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed,
    pliant_call_registers, 3,
    pliant_modify_registers, 3,
    pliant_modify_registers, 3,
    pliant_return_registers, 1 };
#endif

#if defined(_REGISTERS_) && defined(_WATCOM_) && defined(_i386_)
  static Int pliant_call_registers[4] = {Register_EAX,Register_EDX,Register_EBX,Register_ECX};
  static Int pliant_modify_registers[1] = {Register_EAX};
  static Int pliant_return_registers[1] = {Register_EAX};
  static struct CompilingRules compiler_rules = {
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed|
    Function_flag_modify_call_registers,
    pliant_call_registers, 4,
    pliant_modify_registers, 1,
    pliant_modify_registers, 1,
    pliant_return_registers, 1 };
#endif

#if !defined(_REGISTERS_) && defined(_i386_)
  /* let's assume the compiler is using 'cdecl' calling convention */
  static Int pliant_call_registers[1];
  static Int pliant_modify_registers[3] = {Register_EAX,Register_EDX,Register_ECX};
  static Int pliant_return_registers[1] = {Register_EAX};
  static struct CompilingRules compiler_rules = {
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed|
    Function_flag_not_popped,
    pliant_call_registers, 0,
    pliant_modify_registers, 3,
    pliant_modify_registers, 3,
    pliant_return_registers, 1 };
#endif


#ifdef _i386_
  static Int varargs_call_registers[1];
  static Int varargs_modify_registers[3] = {Register_EAX,Register_EDX,Register_ECX};
  static Int varargs_return_registers[1] = {Register_EAX};
  static struct CompilingRules varargs_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed|
    Function_flag_not_popped,
    varargs_call_registers, 0,
    varargs_modify_registers, 3,
    varargs_modify_registers, 3,
    varargs_return_registers, 1 };
#endif


#if (defined(_LINUX_API_) || defined(_POSIX_API_) || defined(_OS2_API_)) && defined(_i386_)
  static Int external_call_registers[1];
  static Int external_modify_registers[3] = {Register_EAX,Register_EDX,Register_ECX};
  static Int external_return_registers[1] = {Register_EAX};
  static struct CompilingRules external_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed|
    Function_flag_not_popped,
    external_call_registers, 0,
    external_modify_registers, 3,
    external_modify_registers, 3,
    external_return_registers, 1 };
#endif

#if defined(_WIN32_API_) && defined(_i386_)
  static Int external_call_registers[1];
  static Int external_modify_registers[3] = {Register_EAX,Register_ECX,Register_EDX};
  static Int external_return_registers[1] = {Register_EAX};
  static struct CompilingRules external_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_push_reversed,
    external_call_registers, 0,
    external_modify_registers, 3,
    external_modify_registers, 3,
    external_return_registers, 1 };
#endif


#if defined(_LINUX_API_) && defined(_i386_)
  static Int kernel_call_registers[5] = {Register_EBX,Register_ECX,Register_EDX,Register_ESI,Register_EDI};
  static Int kernel_call_registers[6] = {Register_EBX,Register_ECX,Register_EDX,Register_ESI,Register_EDI,Register_EBP};
  static Int kernel_modify_registers[1] = {Register_EAX};
  static Int kernel_return_registers[1] = {Register_EAX};
  static struct CompilingRules kernel_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue,
    kernel_call_registers, 5,
    kernel_call_registers, 6,
    kernel_modify_registers, 1,
    kernel_modify_registers, 1,
    kernel_return_registers, 1 };
#else
  #define kernel_rules external_rules
#endif


/*************************************************************************/


#if defined(_BYTECODE_)
  static Int pliant_call_registers[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  static Int pliant_modify_registers[1] = {0};
  static Int pliant_return_registers[1] = {0};
  static struct CompilingRules compiler_rules = {
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue,
    pliant_call_registers, 16,
    pliant_modify_registers, 1,
    pliant_modify_registers, 1,
    pliant_return_registers, 1 };
#endif


/*************************************************************************/


#if defined(_GCC_) && defined(_ALPHA_)
  static Int pliant_call_registers[6] = {16,17,18,19,20,21};
  static Int pliant_modify_registers[6] = {16,17,18,19,20,21};
  static Int pliant_return_registers[1] = {0};
  static struct CompilingRules compiler_rules = {
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue,
    pliant_call_registers, 6,
    pliant_modify_registers, 6,
    pliant_return_registers, 1 };

  static Int varargs_call_registers[1];
  static Int varargs_modify_registers[6] = {16,17,18,19,20,21};
  static Int varargs_return_registers[1] = {0};
  static struct CompilingRules varargs_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue|
    Function_flag_not_popped,
    varargs_call_registers, 0,
    varargs_modify_registers, 6,
    varargs_return_registers, 1 };
#endif

#if (defined(_LINUX_API_) || defined(_POSIX_API_)) && defined(_ALPHA_)
  static Int external_call_registers[6] = {16,17,18,19,20,21};
  static Int external_modify_registers[6] = {16,17,18,19,20,21};
  static Int external_return_registers[1] = {0};
  static struct CompilingRules external_rules = {
    Function_flag_has_side_effects|
    Function_flag_byvalue_result_first|
    Function_flag_mapped_result_first|
    Function_flag_ro_byvalue|
    Function_flag_result_byvalue,
    external_call_registers, 6,
    external_modify_registers, 6,
    external_return_registers, 1 };
#endif