/* * CDDL HEADER START * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the "License"). You may not use this file except * in compliance with the License. * * You can obtain a copy of the license at * src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing * permissions and limitations under the License. * * When distributing Covered Code, include this CDDL * HEADER in each file and include the License file at * usr/src/OPENSOLARIS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include #include #include #include #include #include #include #include "libmicro.h" #include #ifdef USE_RDTSC #ifdef __GNUC__ #define ENABLE_RDTSC 1 #endif #endif /* * dummy so we can link w/ libmicro */ /*ARGSUSED*/ int benchmark(void *tsd, result_t *res) { return (0); } static void cleanup(char *s) { char *o = s; char *e; while (*s == ' ') s++; if (o != s) (void) strcpy(o, s); e = o; while (*e != 0) e++; e--; while (*e == ' ' && e > o) *e-- = 0; } int main(int argc, char *argv[]) { int c; if (strlen(compiler_version) > 30) compiler_version[30] = 0; cleanup(compiler_version); cleanup(extra_compiler_flags); while ((c = getopt(argc, argv, "vcfrsVTR")) != -1) { switch (c) { case 'V': (void) printf("%s\n", LIBMICRO_VERSION); break; case 'v': (void) printf("%s\n", compiler_version); break; case 'c': (void) printf("%s\n", CC); break; case 'f': if (strlen(extra_compiler_flags) == 0) (void) printf("[none]\n"); else (void) printf("%s\n", extra_compiler_flags); break; case 's': (void) printf("%d\n", sizeof (long)); break; case 'r': (void) printf("%lld nsecs\n", get_nsecs_resolution()); break; case 'R': #ifdef ENABLE_RDTSC { struct timeval s; struct timeval f; long long start_nsecs; long long end_nsecs; long elapsed_usecs; gettimeofday(&s, NULL); start_nsecs = rdtsc(); for (;;) { gettimeofday(&f, NULL); elapsed_usecs = (f.tv_sec - s.tv_sec) * 1000000 + (f.tv_usec - s.tv_usec); if (elapsed_usecs > 1000000) break; } end_nsecs = rdtsc(); (void) printf("LIBMICRO_HZ=%lld\n", (long long)elapsed_usecs * (end_nsecs - start_nsecs) / 1000000LL); } #else (void) printf("\n"); #endif break; } } exit(0); return (0); }