1 /* Copyright (C) 2021-2023 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
26 #include "stopwatch.h"
29 #define DYNSOROUTINE "sx_cputime"
30 #define DYNSONAME "./so_syx.so"
32 /* callsx -- dynamically link a shared object, and call a routine in it */
36 static void *sx_object
= NULL
;
37 static void closesx (void);
48 hrtime_t start
= gethrtime ();
49 hrtime_t vstart
= gethrvtime ();
52 wlog ("start of callsx", NULL
);
54 /* see if already linked */
55 if (sx_object
!= NULL
)
57 fprintf (stderr
, "Execution error -- callsx: sx_object already linked\n");
61 /* open the dynamic shared object */
62 /* open the dynamic shared object */
64 while (sx_object
== NULL
)
66 sx_object
= dlopen (DYNSONAME
, RTLD_NOW
);
67 if (sx_object
!= NULL
)
70 if (q
== NULL
) q
= "DYNSONAME";
71 if (p
== NULL
) p
= "dlerror() returns NULL";
77 fprintf (stderr
, "Execution error -- callso: dlopen of %s failed--%s, errno=%d (%s)\n",
78 q
, p
, errnum
, strerror (errnum
));
83 /* look up the routine name in it */
84 int (*sx_routine
)() = (int (*)())dlsym (sx_object
, DYNSOROUTINE
);
85 if (sx_routine
== NULL
)
87 fprintf (stderr
, "Execution error -- callsx: dlsym %s not found\n",
92 /* invoke the routine */
99 while (start
+ testtime
* 1e9
> gethrtime ());
102 sprintf (buf
, "end of callsx, %s returned %d", DYNSOROUTINE
, i
);
104 fprintf (stderr
, " Performed %lld while-loop iterations\n", count
);
105 whrvlog ((gethrtime () - start
), (gethrvtime () - vstart
), "callsx", NULL
);
109 /* closesx -- close a DSO */
114 wlog ("start of closesx", NULL
);
116 /* ensure already linked */
117 if (sx_object
== NULL
)
119 fprintf (stderr
, "Execution error -- closesx: sx_object not linked\n");
124 /* close the dynamic shared object */
125 rc
= dlclose (sx_object
);
128 fprintf (stderr
, "Execution error -- closesx: dlclose() failed--%s\n",
132 /* clear the pointer */
135 wlog ("end of closesx", NULL
);
139 #else /* NONSHARED */
152 #endif /* NONSHARED */