You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.2 KiB
48 lines
1.2 KiB
--- a/gpr/src/gpr_imports.c 2022-02-27 10:10:34.053638209 +0100
|
|
+++ b/gpr/src/gpr_imports.c 2022-02-27 10:12:03.898276758 +0100
|
|
@@ -114,6 +114,44 @@
|
|
const char *__gnat_default_libgcc_subdir = "lib";
|
|
#endif
|
|
|
|
+#include <sys/types.h>
|
|
+#include <sys/stat.h>
|
|
+#include <limits.h>
|
|
+#include <unistd.h>
|
|
+
|
|
+ extern long long __gnat_file_time(char* name)
|
|
+ {
|
|
+ long long result;
|
|
+
|
|
+ if (name == NULL) {
|
|
+ return LLONG_MIN;
|
|
+ }
|
|
+ /* Number of seconds between <Jan 1st 1970> and <Jan 1st 2150>. */
|
|
+ static const long long ada_epoch_offset = (136 * 365 + 44 * 366) * 86400LL;
|
|
+ struct stat sb;
|
|
+ if (stat(name, &sb) != 0) {
|
|
+ return LLONG_MIN;
|
|
+ }
|
|
+
|
|
+ // return (sb.st_mtim.tv_sec - ada_epoch_offset) * 1E9
|
|
+ // + sb.st_mtim.tv_nsec;
|
|
+ // with check overflow below
|
|
+
|
|
+ if (__builtin_ssubll_overflow(sb.st_mtim.tv_sec, ada_epoch_offset, &result)) {
|
|
+ return LLONG_MIN;
|
|
+ }
|
|
+
|
|
+ if (__builtin_smulll_overflow(result, 1E9, &result)) {
|
|
+ return LLONG_MIN;
|
|
+ }
|
|
+
|
|
+ if (__builtin_saddll_overflow(result, sb.st_mtim.tv_nsec, &result)) {
|
|
+ return LLONG_MIN;
|
|
+ }
|
|
+
|
|
+ return result;
|
|
+ }
|
|
+
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|