Skip to content

Commit 9241d6f

Browse files
committed
optimization: do not init/link rtc and timezone related functions if never called
1 parent 74cdd9e commit 9241d6f

File tree

5 files changed

+58
-8
lines changed

5 files changed

+58
-8
lines changed

ee/libcglue/Makefile

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,16 @@
88

99
EE_LIB = libcglue.a
1010

11-
CORE_OBJS = rtc.o
11+
RTC_OBJS = \
12+
_libcglue_rtc_data.o \
13+
_libcglue_rtc_get_offset_from_busclk.o \
14+
_libcglue_rtc_update.o
1215

13-
TIMEZONE_OBJS = _libcglue_timezone_update.o ps2sdk_setTimezone.o ps2sdk_setDaylightSaving.o
16+
TIMEZONE_OBJS = \
17+
_libcglue_timezone_update_impl.o \
18+
_libcglue_timezone_update.o \
19+
ps2sdk_setTimezone.o \
20+
ps2sdk_setDaylightSaving.o
1421

1522
FDMAN_OBJS = \
1623
__fdman_sema.o \
@@ -229,6 +236,7 @@ SOCKET_OBJS = \
229236

230237
EE_OBJS = \
231238
$(CORE_OBJS) \
239+
$(RTC_OBJS) \
232240
$(TIMEZONE_OBJS) \
233241
$(SJIS_OBJS) \
234242
$(TIME_OBJS) \
@@ -249,6 +257,10 @@ include $(PS2SDKSRC)/ee/Rules.lib.make
249257
include $(PS2SDKSRC)/ee/Rules.make
250258
include $(PS2SDKSRC)/ee/Rules.release
251259

260+
$(RTC_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)rtc.c
261+
$(DIR_GUARD)
262+
$(EE_C_COMPILE) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@
263+
252264
$(TIMEZONE_OBJS:%=$(EE_OBJS_DIR)%): $(EE_SRC_DIR)timezone.c
253265
$(DIR_GUARD)
254266
$(EE_C_COMPILE) -DF_$(*:$(EE_OBJS_DIR)%=%) $< -c -o $@

ee/libcglue/include/ps2sdkapi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ static inline ps2_clock_t ps2_clock(void) {
175175
}
176176

177177
extern s64 _ps2sdk_rtc_offset_from_busclk;
178+
s64 _libcglue_rtc_get_offset_from_busclk(void);
179+
extern void _libcglue_rtc_update_impl();
178180
extern void _libcglue_rtc_update();
179181

180182
// The newlib port does not support 64bit
@@ -183,6 +185,7 @@ typedef int64_t off64_t;
183185
extern off64_t lseek64(int fd, off64_t offset, int whence);
184186

185187
// Functions to be used related to timezone
188+
extern void _libcglue_timezone_update_impl();
186189
extern void _libcglue_timezone_update();
187190

188191
extern void ps2sdk_setTimezone(int timezone);

ee/libcglue/src/glue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ int _gettimeofday(struct timeval *tv, struct timezone *tz)
788788
u32 busclock_usec;
789789

790790
TimerBusClock2USec(GetTimerSystemTime(), &busclock_sec, &busclock_usec);
791-
tv->tv_sec = (time_t)(_ps2sdk_rtc_offset_from_busclk + ((s64)busclock_sec));
791+
tv->tv_sec = (time_t)(_libcglue_rtc_get_offset_from_busclk() + ((s64)busclock_sec));
792792
tv->tv_usec = busclock_usec;
793793
}
794794

ee/libcglue/src/rtc.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@
2424
// The definition for this function is located in ee/rpc/cdvd/src/scmd.c
2525
extern time_t ps2time(time_t *t);
2626

27+
#ifdef F__libcglue_rtc_data
2728
s64 _ps2sdk_rtc_offset_from_busclk = 0;
29+
#endif
2830

29-
__attribute__((weak))
30-
void _libcglue_rtc_update()
31+
#ifdef F__libcglue_rtc_get_offset_from_busclk
32+
s64 _libcglue_rtc_get_offset_from_busclk(void)
33+
{
34+
return _ps2sdk_rtc_offset_from_busclk;
35+
}
36+
37+
void _libcglue_rtc_update_impl()
3138
{
3239
time_t rtc_sec;
3340
u32 busclock_sec;
@@ -38,3 +45,17 @@ void _libcglue_rtc_update()
3845

3946
_ps2sdk_rtc_offset_from_busclk = ((s64)rtc_sec) - ((s64)busclock_sec);
4047
}
48+
#endif
49+
50+
#ifdef F__libcglue_rtc_update
51+
void __attribute__((weak)) _libcglue_rtc_update_impl();
52+
__attribute__((weak))
53+
void _libcglue_rtc_update()
54+
{
55+
// cppcheck-suppress knownConditionTrueFalse
56+
if (&_libcglue_rtc_update_impl)
57+
{
58+
_libcglue_rtc_update_impl();
59+
}
60+
}
61+
#endif

ee/libcglue/src/timezone.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@
1818
#include <stdlib.h>
1919
#include <unistd.h>
2020
#include <fcntl.h>
21+
#include <reent.h>
2122

2223
#include <ps2sdkapi.h>
2324
#define OSD_CONFIG_NO_LIBCDVD
2425
#include "osd_config.h"
2526

2627
#define posixIODriver { open, close, (int (*)(int, void *, int))read, O_RDONLY }
2728

28-
#ifdef F__libcglue_timezone_update
29-
__attribute__((weak))
30-
void _libcglue_timezone_update()
29+
#ifdef F__libcglue_timezone_update_impl
30+
void _libcglue_timezone_update_impl()
3131
{
3232
/* Initialize timezone from PS2 OSD configuration */
3333
_io_driver driver = posixIODriver;
@@ -45,6 +45,20 @@ void _libcglue_timezone_update()
4545
}
4646
#endif
4747

48+
#ifdef F__libcglue_timezone_update
49+
// Defined in newlib: newlib/libc/time/tzset_r.c
50+
void __attribute((weak)) _tzset_unlocked_r(struct _reent *reent_ptr);
51+
__attribute__((weak))
52+
void _libcglue_timezone_update()
53+
{
54+
// cppcheck-suppress knownConditionTrueFalse
55+
if (&_tzset_unlocked_r)
56+
{
57+
_libcglue_timezone_update_impl();
58+
}
59+
}
60+
#endif
61+
4862
#ifdef F_ps2sdk_setTimezone
4963
void ps2sdk_setTimezone(int timezone) {
5064
_io_driver driver = posixIODriver;

0 commit comments

Comments
 (0)