shithub: minivmac

ref: 649e0914486b43f31c89f8d17efc16d9df120198
dir: /setup/WRCNFGGL.i/

View raw version
/*
	WRCNFGGL.i
	Copyright (C) 2007 Paul C. Pratt

	You can redistribute this file and/or modify it under the terms
	of version 2 of the GNU General Public License as published by
	the Free Software Foundation.  You should have received a copy
	of the license along with this file; see the file COPYING.

	This file 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
	license for more details.
*/

/*
	WRite "CNFGGLob.h"
*/


LOCALPROC WriteConfigurationWarning(void)
{
	WriteBlankLineToDestFile();
	WriteDestFileLn(
		"This file is automatically generated by the build system,");
	WriteDestFileLn(
		"which tries to know what options are valid in what");
	WriteDestFileLn(
		"combinations. Avoid changing this file manually unless");
	WriteDestFileLn(
		"you know what you're doing.");
}

LOCALPROC WriteCommonCNFGGLOBContents(void)
{
	WriteDestFileLn("/*");
	++DestFileIndent;
		WriteDestFileLn(
			"Configuration options used by both platform specific");
		WriteDestFileLn(
			"and platform independent code.");
		WriteConfigurationWarning();
	--DestFileIndent;
	WriteDestFileLn("*/");

	WriteBlankLineToDestFile();
	WriteDestFileLn("/* adapt to current compiler/host processor */");

	if (gbk_ide_mw8 == cur_ide) {
		WriteDestFileLn("/* make sure this is correct CNFGGLOB */");

		WriteCheckPreDef("__MWERKS__");
		switch (gbo_cpufam) {
			case gbk_cpufam_68k:
				WriteCheckPreDef("__MC68K__");
				if (gbk_targ_mfpu == cur_targ) {
					WriteCheckPreDef("__MC68881__");
				} else {
					WriteCheckPreNDef("__MC68881__");
				}
				break;
			case gbk_cpufam_ppc:
				WriteCheckPreDef("__POWERPC__");
				break;
			case gbk_cpufam_x86:
				WriteCheckPreDef("__INTEL__");
				break;
		}
	} else if ((gbk_ide_bgc == cur_ide)
		|| (gbk_ide_xcd == cur_ide)
		|| (gbk_ide_mvc == cur_ide))
	{
		switch (gbo_cpufam) {
			case gbk_cpufam_x86:
				WriteDestFileLn("#ifdef __x86_64__");
				WriteDestFileLn("#error \"source is configured for"
					" 32 bit compiler\"");
				WriteDestFileLn("#endif");
				break;
			case gbk_cpufam_x64:
				WriteDestFileLn("#ifdef __i386__");
				WriteDestFileLn("#error \"source is configured for"
					" 64 bit compiler\"");
				WriteDestFileLn("#endif");
				break;
		}
	}

	WriteBlankLineToDestFile();

#if NeedIntFormatInfo
	WriteCompCondBool("MostSigByteFirst",
		(gbk_cpufam_68k == gbo_cpufam)
		|| (gbk_cpufam_ppc == gbo_cpufam));
	WriteCompCondBool("LeastSigByteFirst",
		(gbk_cpufam_x86 == gbo_cpufam)
		|| (gbk_cpufam_x64 == gbo_cpufam));
	WriteCompCondBool("TwosCompSigned",
		(gbk_cpufam_68k == gbo_cpufam)
		|| (gbk_cpufam_ppc == gbo_cpufam)
		|| (gbk_cpufam_x86 == gbo_cpufam)
		|| (gbk_cpufam_x64 == gbo_cpufam));
#endif

	if (gbk_cpufam_68k == gbo_cpufam) {
		WriteDestFileLn("#define HaveCPUfamM68K 1");
	}

	if ((gbk_ide_bgc == cur_ide)
		|| (gbk_ide_xcd == cur_ide)
		|| (gbk_ide_mvc == cur_ide)
		|| (gbk_ide_cyg == cur_ide)
		|| (gbk_ide_dkp == cur_ide))
	{
		WriteDestFileLn(
			"#define MayInline inline __attribute__((always_inline))");
	} else
	if (gbk_ide_snc == cur_ide) {
		WriteDestFileLn("#define MayInline inline");
	} else
	if (gbk_ide_mw8 == cur_ide) {
		WriteDestFileLn("#define MayInline __inline__");
	} else
	if (gbk_ide_msv == cur_ide) {
		if (ide_vers >= 6000) {
			WriteDestFileLn("#define MayInline __forceinline");
		} else {
			WriteDestFileLn("#define MayInline __inline");
		}
	} else
	{
		/* WriteDestFileLn("#define MayInline"); */
	}

	if ((gbk_ide_bgc == cur_ide)
		|| (gbk_ide_xcd == cur_ide)
		|| (gbk_ide_mvc == cur_ide)
		|| (gbk_ide_cyg == cur_ide)
		|| (gbk_ide_dkp == cur_ide))
	{
		WriteDestFileLn(
			"#define MayNotInline __attribute__((noinline))");
	} else
	if ((gbk_ide_msv == cur_ide) && (ide_vers >= 7000)) {
		WriteDestFileLn("#define MayNotInline __declspec(noinline)");
	} else
	{
		/* WriteDestFileLn("#define MayNotInline"); */
	}

	if (gbk_ide_mvc == cur_ide) {
		if ((gbk_cpufam_68k == gbo_cpufam)
			|| (gbk_cpufam_ppc == gbo_cpufam))
		{
			WriteDestFileLn("#define BigEndianUnaligned 1");
			WriteDestFileLn("#define LittleEndianUnaligned 0");
		} else if ((gbk_cpufam_x86 == gbo_cpufam)
			|| (gbk_cpufam_x64 == gbo_cpufam))
		{
			WriteDestFileLn("#define BigEndianUnaligned 0");
			WriteDestFileLn("#define LittleEndianUnaligned 1");
		} else {
			WriteDestFileLn("#define BigEndianUnaligned 0");
			WriteDestFileLn("#define LittleEndianUnaligned 0");
		}

		if (gbk_cpufam_x86 == gbo_cpufam) {
			WriteDestFileLn(
				"#define my_reg_call __attribute__ ((regparm(3)))");
		}

		if (gbk_cpufam_x86 == gbo_cpufam) {
			WriteDestFileLn(
				"#define my_osglu_call __attribute__ "
					"((force_align_arg_pointer))");
		}

		WriteDestFileLn("#define my_cond_rare(x) "
			"(__builtin_expect(x, 0))");
		WriteDestFileLn("#define Have_ASR 1");
		if (gbk_cpufam_x64 == gbo_cpufam) {
			WriteDestFileLn("#define HaveUi6Div 1");
		}
		if (gbk_targ_wcar == cur_targ) {
			WriteDestFileLn("#define HaveUi5to6Mul 0");
		}
		if ((gbk_cpufam_x64 == gbo_cpufam)
			|| (gbk_cpufam_ppc == gbo_cpufam)
			|| (gbk_cpufam_arm == gbo_cpufam))
		{
			WriteDestFileLn("#define HaveGlbReg 1");
		}
		WriteDestFileLn(
			"#define my_align_8 __attribute__ ((aligned (8)))");
	}

	WriteCompCondBool("SmallGlobals", gbk_cpufam_68k == gbo_cpufam);

	if ((gbk_ide_bgc == cur_ide)
		|| (gbk_ide_xcd == cur_ide)
		|| (gbk_ide_mvc == cur_ide)
		|| (gbk_ide_ccc == cur_ide)
		|| (gbk_ide_dvc == cur_ide)
		|| (gbk_ide_mgw == cur_ide)
		|| (gbk_ide_dmc == cur_ide)
		|| (gbk_ide_lcc == cur_ide)
		|| (gbk_ide_cyg == cur_ide)
		|| (gbk_ide_dkp == cur_ide)
		)
	{
		WriteDestFileLn("#define cIncludeUnused 0");
	} else {
		WriteDestFileLn("#define cIncludeUnused 1");
	}

	if (gbk_ide_lcc == cur_ide) {
		WriteDestFileLn("#define UnusedParam(x)");
	} else {
		WriteDestFileLn("#define UnusedParam(p) (void) p");
	}

	if (gbk_ide_msv == cur_ide) {
		WriteBlankLineToDestFile();
		WriteDestFileLn("/* --- set up compiler options --- */");
		WriteBlankLineToDestFile();
		WriteDestFileLn("/* ignore integer conversion warnings */");
		WriteDestFileLn(
			"#pragma warning(disable : 4244 4761 4018 4245 4024 4305)");
		WriteBlankLineToDestFile();
		WriteDestFileLn("/* ignore unused inline warning */");
		WriteDestFileLn("#pragma warning(disable : 4514 4714)");
#if 0
		WriteBlankLineToDestFile();
		WriteDestFileLn("/* ignore type redefinition warning */");
		WriteDestFileLn("#pragma warning(disable : 4142)");
#endif
		WriteBlankLineToDestFile();
		WriteDestFileLn(
			"/* ignore unary minus operator"
			" applied to unsigned type warning */");
		WriteDestFileLn("#pragma warning(disable : 4146)");

	if (cur_mIIorIIX
		|| (em_cpu_vers >= 2))
	{
		/* C4127: conditional expression is constant */
		/*
			C4701: local variable may have been used without having
			been initialized
		*/
		WriteBlankLineToDestFile();
		WriteDestFileLn("/* more warnings */");
		WriteDestFileLn("#pragma warning(disable : 4127 4701)");
	}

	} else if (gbk_ide_plc == cur_ide) {
		WriteBlankLineToDestFile();
		WriteDestFileLn("#pragma warn(disable: 2135 2137)");
	}

	if (gbk_ide_mw8 == cur_ide) {
		if (gbk_dbg_on != gbo_dbg) {
			WriteBlankLineToDestFile();
			WriteDestFileLn("#ifdef OptForSpeed");
			WriteDestFileLn("#pragma optimize_for_size off");
			WriteDestFileLn("#endif");
		}
	}

	WriteBlankLineToDestFile();
	WriteDestFileLn("/* --- integer types ---- */");

	/*
		define signed and unsigned integer types
		for 8 bits, 16 bits, 32 bits, and so on.

		the computer might not have integer types
		of a given size. in this case should define
		a type of correct size, such as a structure
		type, even if the computer can't directly do
		integer operations on it. then set
		HaveReal?i?b to 0.
	*/

	/* 8 bits */

	/* (ui3b)0 - (ui3b)1 == (ui3b)255 */
	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef unsigned char ui3b;");
	WriteDestFileLn("#define HaveRealui3b 1");

	/* sizeof(si3b) == sizeof(ui3b) */
	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef signed char si3b;");
	WriteDestFileLn("#define HaveRealsi3b 1");

	/* 16 bits */

	/* (ui4b)0 - (ui4b)1 == (ui4b)65535 */
	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef unsigned short ui4b;");
	WriteDestFileLn("#define HaveRealui4b 1");

	/* sizeof(si4b) == sizeof(ui4b) */
	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef short si4b;");
	WriteDestFileLn("#define HaveRealsi4b 1");

	/* 32 bits */

	/* (ui5b)0 - (ui5b)1 == (ui5b)4294967295 */
	WriteBlankLineToDestFile();
	if (gbk_cpufam_x64 == gbo_cpufam) {
		WriteDestFileLn("typedef unsigned int ui5b;");
	} else {
		WriteDestFileLn("typedef unsigned long ui5b;");
	}
	WriteDestFileLn("#define HaveRealui5b 1");

	/* sizeof(si5b) == sizeof(ui5b) */
	WriteBlankLineToDestFile();
	if (gbk_cpufam_x64 == gbo_cpufam) {
		WriteDestFileLn("typedef int si5b;");
	} else {
		WriteDestFileLn("typedef long si5b;");
	}
	WriteDestFileLn("#define HaveRealsi5b 1");

	/* 64 bits */ /* this is mostly for illustration, not used */
#if 0
	struct ui6b {
		ui5b f0;
		ui5b f1;
	};
	typedef struct ui6b ui6b;

	struct si6b {
		ui5b f0;
		si5b f1;
	};
	typedef struct si6b si6b;
#endif
	WriteBlankLineToDestFile();
	WriteDestFileLn("#define HaveRealui6b 0");
	WriteDestFileLn("#define HaveRealsi6b 0");

	WriteBlankLineToDestFile();
	WriteDestFileLn("/* --- integer representation types ---- */");

	/*
		for each integer type, define
		the most efficient representation
		for parameter passing and temporary
		variables on the current
		computer.
	*/

	WriteBlankLineToDestFile();
#if ModPPCi3rTypes
	if (gbk_cpufam_ppc == gbo_cpufam) {
		WriteDestFileLn("typedef ui5b ui3r;");
		WriteDestFileLn("#define ui3beqr 0");
	} else
#endif
	{
		WriteDestFileLn("typedef ui3b ui3r;");
		WriteDestFileLn("#define ui3beqr 1");
	}

	WriteBlankLineToDestFile();
#if ModPPCi3rTypes
	if (gbk_cpufam_ppc == gbo_cpufam) {
		WriteDestFileLn("typedef si5b si3r;");
		WriteDestFileLn("#define si3beqr 0");
	} else
#endif
	{
		WriteDestFileLn("typedef si3b si3r;");
		WriteDestFileLn("#define si3beqr 1");
	}

	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef ui4b ui4r;");
	WriteDestFileLn("#define ui4beqr 1");

	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef si4b si4r;");
	WriteDestFileLn("#define si4beqr 1");

	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef ui5b ui5r;");
	WriteDestFileLn("#define ui5beqr 1");

	WriteBlankLineToDestFile();
	WriteDestFileLn("typedef si5b si5r;");
	WriteDestFileLn("#define si5beqr 1");

	if (gbk_ide_mvc == cur_ide) {
		if (gbk_cpufam_x86 == gbo_cpufam)
		{
			WriteBlankLineToDestFile();
			WriteDestFileLn("/* for probable register parameters */");
			WriteDestFileLn("#define ui4rr ui5r");
			WriteDestFileLn("#define ui3rr ui5r");
		} else if (gbk_cpufam_x64 == gbo_cpufam) {
#if 0
			WriteBlankLineToDestFile();
			WriteDestFileLn("/* for probable register parameters */");
			WriteDestFileLn("#define ui4rr unsigned long int");
			WriteDestFileLn("#define ui3rr unsigned long int");
#endif
			WriteDestFileLn("#define si5rr signed long");
		}

		WriteBlankLineToDestFile();
		WriteDestFileLn(
			"#define MySwapUi5r(x) ((ui5r)__builtin_bswap32(x))");
		WriteDestFileLn("#define HaveMySwapUi5r 1");
	}
}

LOCALPROC Write64bitConfig(void)
{
	WriteBlankLineToDestFile();
	if (gbk_ide_msv == cur_ide) {
		WriteDestFileLn("typedef signed __int64 si6r;");
		WriteDestFileLn("typedef signed __int64 si6b;");
		WriteDestFileLn("typedef unsigned __int64 ui6r;");
		WriteDestFileLn("typedef unsigned __int64 ui6b;");
		WriteDestFileLn("#define LIT64(a) a##Ui64");
	} else {
		WriteDestFileLn("typedef signed long long si6r;");
		WriteDestFileLn("typedef signed long long si6b;");
		WriteDestFileLn("typedef unsigned long long ui6r;");
		WriteDestFileLn("typedef unsigned long long ui6b;");
		WriteDestFileLn("#define LIT64(a) a##ULL");
	}
}