simplesim-3.0/sysprobe.c

279 lines
6.9 KiB
C

/* sysprobe.c - host endian probe implementation */
/* SimpleScalar(TM) Tool Suite
* Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC.
* All Rights Reserved.
*
* THIS IS A LEGAL DOCUMENT, BY USING SIMPLESCALAR,
* YOU ARE AGREEING TO THESE TERMS AND CONDITIONS.
*
* No portion of this work may be used by any commercial entity, or for any
* commercial purpose, without the prior, written permission of SimpleScalar,
* LLC (info@simplescalar.com). Nonprofit and noncommercial use is permitted
* as described below.
*
* 1. SimpleScalar is provided AS IS, with no warranty of any kind, express
* or implied. The user of the program accepts full responsibility for the
* application of the program and the use of any results.
*
* 2. Nonprofit and noncommercial use is encouraged. SimpleScalar may be
* downloaded, compiled, executed, copied, and modified solely for nonprofit,
* educational, noncommercial research, and noncommercial scholarship
* purposes provided that this notice in its entirety accompanies all copies.
* Copies of the modified software can be delivered to persons who use it
* solely for nonprofit, educational, noncommercial research, and
* noncommercial scholarship purposes provided that this notice in its
* entirety accompanies all copies.
*
* 3. ALL COMMERCIAL USE, AND ALL USE BY FOR PROFIT ENTITIES, IS EXPRESSLY
* PROHIBITED WITHOUT A LICENSE FROM SIMPLESCALAR, LLC (info@simplescalar.com).
*
* 4. No nonprofit user may place any restrictions on the use of this software,
* including as modified by the user, by any other authorized user.
*
* 5. Noncommercial and nonprofit users may distribute copies of SimpleScalar
* in compiled or executable form as set forth in Section 2, provided that
* either: (A) it is accompanied by the corresponding machine-readable source
* code, or (B) it is accompanied by a written offer, with no time limit, to
* give anyone a machine-readable copy of the corresponding source code in
* return for reimbursement of the cost of distribution. This written offer
* must permit verbatim duplication by anyone, or (C) it is distributed by
* someone who received only the executable form, and is accompanied by a
* copy of the written offer of source code.
*
* 6. SimpleScalar was developed by Todd M. Austin, Ph.D. The tool suite is
* currently maintained by SimpleScalar LLC (info@simplescalar.com). US Mail:
* 2395 Timbercrest Court, Ann Arbor, MI 48105.
*
* Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC.
*/
#include <stdio.h>
#include <stdlib.h>
#ifndef _MSC_VER
#include <unistd.h>
#else /* _MSC_VER */
#define access _access
#define X_OK 4
#endif
#include "host.h"
#include "misc.h"
char *gzip_paths[] =
{
"/bin/gzip",
"/usr/bin/gzip",
"/usr/local/bin/gzip",
"/usr/intel/bin/gzip",
"/usr/gnu/bin/gzip",
"/usr/local/gnu/bin",
NULL
};
#define HOST_ONLY
#include "endian.c"
#define CAT(a,b) a/**/b
#define MSB 0x80000000
int
fast_SRL(void)
{
word_t ui;
if (sizeof(ui) != 4)
{
/* fundamental size assumption broken - emulate SRL */
return FALSE;
}
ui = (word_t)MSB;
if (((ui >> 1) & MSB) != 0)
{
/* unsigned int does SRA - emulate SRL */
return FALSE;
}
else
{
/* unsigned int does SRL - use fast native SRL */
return TRUE;
}
}
int
fast_SRA(void)
{
sword_t si;
if (sizeof(si) != 4)
{
/* fundamental size assumption broken - emulate SRA */
return FALSE;
}
si = (sword_t)MSB;
if ((si >> 1) & MSB)
{
/* signed int does SRA - use fast native SRA */
return TRUE;
}
else
{
/* singned int does SRL - emulate SRA */
return FALSE;
}
}
int
main(int argc, char **argv)
{
int little_bytes = 0, little_words = 0;
if (argc == 2 && !strcmp(argv[1], "-s"))
{
switch (endian_host_byte_order())
{
case endian_big:
fprintf(stdout, "big\n");
break;
case endian_little:
fprintf(stdout, "little\n");
break;
case endian_unknown:
fprintf(stderr, "\nerror: cannot determine byte order!\n");
exit(1);
default:
abort();
}
}
else if (argc == 2 && !strcmp(argv[1], "-libs"))
{
#ifdef BFD_LOADER
fprintf(stdout, "-lbfd -liberty ");
#endif /* BFD_LOADER */
#ifdef linux
/* nada... */
#elif defined(__USLC__) || (defined(__svr4__) && defined(__i386__) && defined(__unix__))
fprintf(stdout, "-L/usr/ucblib -lucb ");
#else
/* nada */
#endif
fprintf(stdout, " \n");
}
else if (argc == 1 || (argc == 2 && !strcmp(argv[1], "-flags")))
{
switch (endian_host_byte_order())
{
case endian_big:
fprintf(stdout, "-DBYTES_BIG_ENDIAN ");
break;
case endian_little:
fprintf(stdout, "-DBYTES_LITTLE_ENDIAN ");
little_bytes = 1;
break;
case endian_unknown:
fprintf(stderr, "\nerror: cannot determine byte order!\n");
exit(1);
default:
abort();
}
switch (endian_host_word_order())
{
case endian_big:
fprintf(stdout, "-DWORDS_BIG_ENDIAN ");
break;
case endian_little:
fprintf(stdout, "-DWORDS_LITTLE_ENDIAN ");
little_words = 1;
break;
case endian_unknown:
fprintf(stderr, "\nerror: cannot determine word order!\n");
exit(1);
default:
abort();
}
#ifdef _AIX
fprintf(stdout, "-D_ALL_SOURCE ");
#endif /* _AIX */
#if (defined(hpux) || defined(__hpux)) && !defined(__GNUC__)
fprintf(stdout, "-D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE -D_INCLUDE_AES_SOURCE ");
#endif /* hpux */
#ifndef __GNUC__
/* probe compiler approach needed to concatenate symbols in CPP,
new style concatenation is always used with GNU GCC */
{
int i = 5, j;
j = CAT(-,-i);
if (j == 4)
{
/* old style symbol concatenation worked */
fprintf(stdout, "-DOLD_SYMCAT ");
}
else if (j == 5)
{
/* old style symbol concatenation does not work, assume that
new style symbol concatenation works */
;
}
else
{
/* huh!?!?! */
fprintf(stderr, "\nerror: cannot grok symbol concat method!\n");
exit(1);
}
}
#endif /* __GNUC__ */
#ifndef SLOW_SHIFTS
/* probe host shift capabilities */
if (fast_SRL())
fprintf(stdout, "-DFAST_SRL ");
if (fast_SRA())
fprintf(stdout, "-DFAST_SRA ");
#endif /* !SLOW_SHIFTS */
/* locate GZIP */
#ifndef GZIP_PATH
{
int i;
for (i=0; gzip_paths[i] != NULL; i++)
{
if (access(gzip_paths[i], X_OK) == 0)
{
fprintf(stdout, "-DGZIP_PATH=\"%s\" ", gzip_paths[i]);
break;
}
}
}
#endif /* !GZIP_PATH */
}
else if (argc == 2 && !strcmp(argv[1], "-t"))
{
fprintf(stdout, "sizeof(int) = %ld\n", sizeof(int));
fprintf(stdout, "sizeof(long) = %ld\n", sizeof(long));
}
/* check for different byte/word endian-ness */
if (little_bytes != little_words)
{
fprintf(stderr,
"\nerror: opposite byte/word endian currently not supported!\n");
exit(1);
}
exit(0);
return 0;
}