summaryrefslogtreecommitdiff
blob: ba5c2f858de7176e2a4bbfdac9c1677153b531ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
--- 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