authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-28 17:52:10+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-10-28 17:52:10+01:00
logd22049a987493d1cb64d54829dc042726d6cc2de
tree5b22c7099441e1e8f5e274c6916e28788a52b853
parentcdd8e82f0ac7ace0a03653960fbf9ba3daa69dc4
parentc2e6be97ffc23f2fa6c28175766b8bb565e9c970
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21693 from alexrp/wasm2c-endian

`wasm2c`: Add big endian support.

2 files changed, 102 insertions(+), 62 deletions(-)

stage1/wasi.c+65-41
...@@ -184,6 +184,26 @@ enum wasi_whence {...@@ -184,6 +184,26 @@ enum wasi_whence {
184 wasi_whence_end = 2,184 wasi_whence_end = 2,
185};185};
186186
187extern uint16_t load16_align0(const uint8_t *ptr);
188extern uint16_t load16_align1(const uint16_t *ptr);
189extern uint32_t load32_align0(const uint8_t *ptr);
190extern uint32_t load32_align1(const uint16_t *ptr);
191extern uint32_t load32_align2(const uint32_t *ptr);
192extern uint64_t load64_align0(const uint8_t *ptr);
193extern uint64_t load64_align1(const uint16_t *ptr);
194extern uint64_t load64_align2(const uint32_t *ptr);
195extern uint64_t load64_align3(const uint64_t *ptr);
196
197extern void store16_align0(uint8_t *ptr, uint16_t val);
198extern void store16_align1(uint16_t *ptr, uint16_t val);
199extern void store32_align0(uint8_t *ptr, uint32_t val);
200extern void store32_align1(uint16_t *ptr, uint32_t val);
201extern void store32_align2(uint32_t *ptr, uint32_t val);
202extern void store64_align0(uint8_t *ptr, uint64_t val);
203extern void store64_align1(uint16_t *ptr, uint64_t val);
204extern void store64_align2(uint32_t *ptr, uint64_t val);
205extern void store64_align3(uint64_t *ptr, uint64_t val);
206
187extern uint8_t **const wasm_memory;207extern uint8_t **const wasm_memory;
188extern void wasm__start(void);208extern void wasm__start(void);
189209
...@@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch...@@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch
362}382}
363383
364static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) {384static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) {
365 res_filestat->dev = 0;385 store64_align3(&res_filestat->dev, 0);
366 res_filestat->ino = de;386 store64_align3(&res_filestat->ino, de);
367 res_filestat->filetype = des[de].filetype;387 store64_align3(&res_filestat->filetype, des[de].filetype);
368 res_filestat->nlink = 1;388 store64_align3(&res_filestat->nlink, 1);
369 res_filestat->size = 0;389 store64_align3(&res_filestat->size, 0);
370 res_filestat->atim = des[de].atim * UINT64_C(1000000000);390 store64_align3(&res_filestat->atim, des[de].atim * UINT64_C(1000000000));
371 res_filestat->mtim = des[de].mtim * UINT64_C(1000000000);391 store64_align3(&res_filestat->mtim, des[de].mtim * UINT64_C(1000000000));
372 res_filestat->ctim = des[de].ctim * UINT64_C(1000000000);392 store64_align3(&res_filestat->ctim, des[de].ctim * UINT64_C(1000000000));
373}393}
374394
375static void DirEntry_unlink(uint32_t de) {395static void DirEntry_unlink(uint32_t de) {
...@@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv...@@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv
394 if (i == 1) continue;414 if (i == 1) continue;
395 size += strlen(c_argv[i]) + 1;415 size += strlen(c_argv[i]) + 1;
396 }416 }
397 *argv_size_ptr = c_argc - 1;417 store32_align2(argv_size_ptr, c_argc - 1);
398 *argv_buf_size_ptr = size;418 store32_align2(argv_buf_size_ptr, size);
399 return wasi_errno_success;419 return wasi_errno_success;
400}420}
401421
...@@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) {...@@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) {
413 uint32_t argv_buf_i = 0;433 uint32_t argv_buf_i = 0;
414 for (int src_i = 0; src_i < c_argc; src_i += 1) {434 for (int src_i = 0; src_i < c_argc; src_i += 1) {
415 if (src_i == 1) continue;435 if (src_i == 1) continue;
416 argv_ptr[dst_i] = argv_buf + argv_buf_i;436 store32_align2(&argv_ptr[dst_i], argv_buf + argv_buf_i);
417 dst_i += 1;437 dst_i += 1;
418 strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]);438 strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]);
419 argv_buf_i += strlen(c_argv[src_i]) + 1;439 argv_buf_i += strlen(c_argv[src_i]) + 1;
...@@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat...@@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat
430450
431 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;451 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
432452
433 res_prestat_ptr[0] = 0;453 store32_align2(&res_prestat_ptr[0], 0);
434 res_prestat_ptr[1] = strlen(des[fds[fd].de].guest_path);454 store32_align2(&res_prestat_ptr[1], strlen(des[fds[fd].de].guest_path));
435 return wasi_errno_success;455 return wasi_errno_success;
436}456}
437457
...@@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path,...@@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path,
443#endif463#endif
444464
445 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;465 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
446 strncpy(path_ptr, des[fds[fd].de].guest_path, path_len);466 strncpy(path_ptr, des[fds[fd].de].guest_path, path_len);
447 return wasi_errno_success;467 return wasi_errno_success;
448}468}
449469
...@@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov...@@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov
502522
503 size_t size = 0;523 size_t size = 0;
504 for (uint32_t i = 0; i < iovs_len; i += 1) {524 for (uint32_t i = 0; i < iovs_len; i += 1) {
525 uint32_t len = load32_align2(&iovs_ptr[i].len);
505 size_t read_size = 0;526 size_t read_size = 0;
506 if (fds[fd].stream != NULL)527 if (fds[fd].stream != NULL)
507 read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);528 read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
508 size += read_size;529 size += read_size;
509 if (read_size < iovs_ptr[i].len) break;530 if (read_size < len) break;
510 }531 }
511532
512 if (size > 0) des[fds[fd].de].atim = time(NULL);533 if (size > 0) des[fds[fd].de].atim = time(NULL);
513 *res_size_ptr = size;534 store32_align2(res_size_ptr, size);
514 return wasi_errno_success;535 return wasi_errno_success;
515}536}
516537
...@@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest...@@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest
530 if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io;551 if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io;
531 long size = ftell(fds[fd].stream);552 long size = ftell(fds[fd].stream);
532 if (size < 0) return wasi_errno_io;553 if (size < 0) return wasi_errno_io;
533 res_filestat_ptr->size = size;554 store64_align3(&res_filestat_ptr->size, size);
534 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;555 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
535 return wasi_errno_success;556 return wasi_errno_success;
536}557}
...@@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i...@@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
617638
618 size_t size = 0;639 size_t size = 0;
619 for (uint32_t i = 0; i < iovs_len; i += 1) {640 for (uint32_t i = 0; i < iovs_len; i += 1) {
641 uint32_t len = load32_align2(&iovs_ptr[i].len);
620 size_t written_size = 0;642 size_t written_size = 0;
621 if (fds[fd].stream != NULL)643 if (fds[fd].stream != NULL)
622 written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);644 written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
623 else645 else
624 written_size = iovs_ptr[i].len;646 written_size = len;
625 size += written_size;647 size += written_size;
626 if (written_size < iovs_ptr[i].len) break;648 if (written_size < len) break;
627 }649 }
628650
629 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;651 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
...@@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i...@@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
633 des[fds[fd].de].atim = now;655 des[fds[fd].de].atim = now;
634 des[fds[fd].de].mtim = now;656 des[fds[fd].de].mtim = now;
635 }657 }
636 *res_size_ptr = size;658 store32_align2(res_size_ptr, size);
637 return wasi_errno_success;659 return wasi_errno_success;
638}660}
639661
...@@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_...@@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_
669 fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n");691 fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n");
670#endif692#endif
671693
672 *environ_size_ptr = 0;694 store32_align2(environ_size_ptr, 0);
673 *environ_buf_size_ptr = 0;695 store32_align2(environ_buf_size_ptr, 0);
674 return wasi_errno_success;696 return wasi_errno_success;
675}697}
676698
...@@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u...@@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u
702 if (stream != NULL) {724 if (stream != NULL) {
703 if (fseek(stream, 0, SEEK_END) >= 0) {725 if (fseek(stream, 0, SEEK_END) >= 0) {
704 long size = ftell(stream);726 long size = ftell(stream);
705 if (size >= 0) res_filestat_ptr->size = size;727 if (size >= 0) store64_align3(&res_filestat_ptr->size, size);
706 }728 }
707 fclose(stream);729 fclose(stream);
708 }730 }
...@@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat)...@@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat)
718#endif740#endif
719741
720 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;742 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
721 res_fdstat_ptr->fs_filetype = des[fds[fd].de].filetype;743 store16_align1(&res_fdstat_ptr->fs_filetype, des[fds[fd].de].filetype);
722 res_fdstat_ptr->fs_flags = fds[fd].fdflags;744 store16_align1(&res_fdstat_ptr->fs_flags, fds[fd].fdflags);
723 res_fdstat_ptr->padding = 0;745 store32_align2(&res_fdstat_ptr->padding, 0);
724 res_fdstat_ptr->fs_rights_inheriting = fds[fd].fs_rights_inheriting;746 store64_align3(&res_fdstat_ptr->fs_rights_inheriting, fds[fd].fs_rights_inheriting);
725 return wasi_errno_success;747 return wasi_errno_success;
726}748}
727749
...@@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io...@@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io
757779
758 size_t size = 0;780 size_t size = 0;
759 for (uint32_t i = 0; i < iovs_len; i += 1) {781 for (uint32_t i = 0; i < iovs_len; i += 1) {
782 uint32_t len = load32_align2(&iovs_ptr[i].len);
760 size_t written_size = 0;783 size_t written_size = 0;
761 if (fds[fd].stream != NULL)784 if (fds[fd].stream != NULL)
762 written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);785 written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
763 else786 else
764 written_size = iovs_ptr[i].len;787 written_size = len;
765 size += written_size;788 size += written_size;
766 if (written_size < iovs_ptr[i].len) break;789 if (written_size < len) break;
767 }790 }
768791
769 if (size > 0) {792 if (size > 0) {
...@@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io...@@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io
771 des[fds[fd].de].atim = now;794 des[fds[fd].de].atim = now;
772 des[fds[fd].de].mtim = now;795 des[fds[fd].de].mtim = now;
773 }796 }
774 *res_size_ptr = size;797 store32_align2(res_size_ptr, size);
775 return wasi_errno_success;798 return wasi_errno_success;
776}799}
777800
...@@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32...@@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
809#if LOG_TRACE832#if LOG_TRACE
810 fprintf(stderr, "fd = %u\n", fd_len);833 fprintf(stderr, "fd = %u\n", fd_len);
811#endif834#endif
812 *res_fd_ptr = fd_len;835 store32_align2(res_fd_ptr, fd_len);
813 fd_len += 1;836 fd_len += 1;
814 }837 }
815 if (lookup_errno != wasi_errno_noent) return lookup_errno;838 if (lookup_errno != wasi_errno_noent) return lookup_errno;
...@@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32...@@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
867 fds[fd_len].fdflags = fdflags;890 fds[fd_len].fdflags = fdflags;
868 fds[fd_len].stream = stream;891 fds[fd_len].stream = stream;
869 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;892 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;
870 *res_fd_ptr = fd_len;893 store32_align2(res_fd_ptr, fd_len);
871 fd_len += 1;894 fd_len += 1;
872 return wasi_errno_success;895 return wasi_errno_success;
873}896}
...@@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision,...@@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision,
882905
883 switch (id) {906 switch (id) {
884 case wasi_clockid_realtime:907 case wasi_clockid_realtime:
885 *res_timestamp_ptr = time(NULL) * UINT64_C(1000000000);908 store64_align3(res_timestamp_ptr, time(NULL) * UINT64_C(1000000000));
886 break;909 break;
887 case wasi_clockid_monotonic:910 case wasi_clockid_monotonic:
888 case wasi_clockid_process_cputime_id:911 case wasi_clockid_process_cputime_id:
889 case wasi_clockid_thread_cputime_id:912 case wasi_clockid_thread_cputime_id:
890 *res_timestamp_ptr = clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC);913 store64_align3(res_timestamp_ptr, clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC));
891 break;914 break;
892 default: return wasi_errno_inval;915 default: return wasi_errno_inval;
893 }916 }
...@@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io...@@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io
947970
948 size_t size = 0;971 size_t size = 0;
949 for (uint32_t i = 0; i < iovs_len; i += 1) {972 for (uint32_t i = 0; i < iovs_len; i += 1) {
973 uint32_t len = load32_align2(&iovs_ptr[i].len);
950 size_t read_size = 0;974 size_t read_size = 0;
951 if (fds[fd].stream != NULL)975 if (fds[fd].stream != NULL)
952 read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);976 read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
953 else977 else
954 panic("unimplemented");978 panic("unimplemented");
955 size += read_size;979 size += read_size;
956 if (read_size < iovs_ptr[i].len) break;980 if (read_size < len) break;
957 }981 }
958982
959 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;983 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
960984
961 if (size > 0) des[fds[fd].de].atim = time(NULL);985 if (size > 0) des[fds[fd].de].atim = time(NULL);
962 *res_size_ptr = size;986 store32_align2(res_size_ptr, size);
963 return wasi_errno_success;987 return wasi_errno_success;
964}988}
965989
...@@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_...@@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_
996 if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io;1020 if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io;
997 long res_offset = ftell(fds[fd].stream);1021 long res_offset = ftell(fds[fd].stream);
998 if (res_offset < 0) return wasi_errno_io;1022 if (res_offset < 0) return wasi_errno_io;
999 *res_filesize_ptr = (uint64_t)res_offset;1023 store64_align3(res_filesize_ptr, res_offset);
1000 return wasi_errno_success;1024 return wasi_errno_success;
1001}1025}
10021026
stage1/wasm2c.c+37-21
...@@ -73,14 +73,30 @@ static void renderExpr(FILE *out, struct InputStream *in) {...@@ -73,14 +73,30 @@ static void renderExpr(FILE *out, struct InputStream *in) {
73 }73 }
74}74}
7575
76static const uint32_t big_endian = 0xff000000;
77
76int main(int argc, char **argv) {78int main(int argc, char **argv) {
77 if (argc != 3) {79 if (argc != 3 && argc != 4) {
78 fprintf(stderr, "usage: %s in.wasm.zst out.c\n", argv[0]);80 fprintf(stderr, "usage: %s <in.wasm.zst> <out.c> [endian]\n", argv[0]);
79 return 1;81 return 1;
80 }82 }
8183
84 bool is_big_endian;
85
86 if (argc >= 4) {
87 if (!strcmp(argv[3], "big")) {
88 is_big_endian = true;
89 } else if (!strcmp(argv[3], "little")) {
90 is_big_endian = false;
91 } else {
92 fprintf(stderr, "endianness must be 'big' or 'little'\n");
93 return 1;
94 }
95 } else {
96 is_big_endian = *(uint8_t *)&big_endian; // Infer from host endianness.
97 }
98
82 const char *mod = "wasm";99 const char *mod = "wasm";
83 bool is_big_endian = false; // TODO
84100
85 struct InputStream in;101 struct InputStream in;
86 InputStream_open(&in, argv[1]);102 InputStream_open(&in, argv[1]);
...@@ -111,55 +127,55 @@ int main(int argc, char **argv) {...@@ -111,55 +127,55 @@ int main(int argc, char **argv) {
111 " (uint64_t)i32_byteswap(src >> 32) << 0;\n"127 " (uint64_t)i32_byteswap(src >> 32) << 0;\n"
112 "}\n"128 "}\n"
113 "\n", out);129 "\n", out);
114 fputs("static uint16_t load16_align0(const uint8_t *ptr) {\n"130 fputs("uint16_t load16_align0(const uint8_t *ptr) {\n"
115 " uint16_t val;\n"131 " uint16_t val;\n"
116 " memcpy(&val, ptr, sizeof(val));\n", out);132 " memcpy(&val, ptr, sizeof(val));\n", out);
117 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);133 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
118 fputs(" return val;\n"134 fputs(" return val;\n"
119 "}\n"135 "}\n"
120 "static uint16_t load16_align1(const uint16_t *ptr) {\n"136 "uint16_t load16_align1(const uint16_t *ptr) {\n"
121 " uint16_t val;\n"137 " uint16_t val;\n"
122 " memcpy(&val, ptr, sizeof(val));\n", out);138 " memcpy(&val, ptr, sizeof(val));\n", out);
123 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);139 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
124 fputs(" return val;\n"140 fputs(" return val;\n"
125 "}\n"141 "}\n"
126 "static uint32_t load32_align0(const uint8_t *ptr) {\n"142 "uint32_t load32_align0(const uint8_t *ptr) {\n"
127 " uint32_t val;\n"143 " uint32_t val;\n"
128 " memcpy(&val, ptr, sizeof(val));\n", out);144 " memcpy(&val, ptr, sizeof(val));\n", out);
129 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);145 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
130 fputs(" return val;\n"146 fputs(" return val;\n"
131 "}\n"147 "}\n"
132 "static uint32_t load32_align1(const uint16_t *ptr) {\n"148 "uint32_t load32_align1(const uint16_t *ptr) {\n"
133 " uint32_t val;\n"149 " uint32_t val;\n"
134 " memcpy(&val, ptr, sizeof(val));\n", out);150 " memcpy(&val, ptr, sizeof(val));\n", out);
135 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);151 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
136 fputs(" return val;\n"152 fputs(" return val;\n"
137 "}\n"153 "}\n"
138 "static uint32_t load32_align2(const uint32_t *ptr) {\n"154 "uint32_t load32_align2(const uint32_t *ptr) {\n"
139 " uint32_t val;\n"155 " uint32_t val;\n"
140 " memcpy(&val, ptr, sizeof(val));\n", out);156 " memcpy(&val, ptr, sizeof(val));\n", out);
141 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);157 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
142 fputs(" return val;\n"158 fputs(" return val;\n"
143 "}\n"159 "}\n"
144 "static uint64_t load64_align0(const uint8_t *ptr) {\n"160 "uint64_t load64_align0(const uint8_t *ptr) {\n"
145 " uint64_t val;\n"161 " uint64_t val;\n"
146 " memcpy(&val, ptr, sizeof(val));\n", out);162 " memcpy(&val, ptr, sizeof(val));\n", out);
147 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);163 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
148 fputs(" return val;\n"164 fputs(" return val;\n"
149 "}\n"165 "}\n"
150 "static uint64_t load64_align1(const uint16_t *ptr) {\n"166 "uint64_t load64_align1(const uint16_t *ptr) {\n"
151 " uint64_t val;\n"167 " uint64_t val;\n"
152 " memcpy(&val, ptr, sizeof(val));\n", out);168 " memcpy(&val, ptr, sizeof(val));\n", out);
153 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);169 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
154 fputs(" return val;\n"170 fputs(" return val;\n"
155 "}\n"171 "}\n"
156 "static uint64_t load64_align2(const uint32_t *ptr) {\n"172 "uint64_t load64_align2(const uint32_t *ptr) {\n"
157 " uint64_t val;\n"173 " uint64_t val;\n"
158 " memcpy(&val, ptr, sizeof(val));\n", out);174 " memcpy(&val, ptr, sizeof(val));\n", out);
159 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);175 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
160 fputs(" return val;\n"176 fputs(" return val;\n"
161 "}\n"177 "}\n"
162 "static uint64_t load64_align3(const uint64_t *ptr) {\n"178 "uint64_t load64_align3(const uint64_t *ptr) {\n"
163 " uint64_t val;\n"179 " uint64_t val;\n"
164 " memcpy(&val, ptr, sizeof(val));\n", out);180 " memcpy(&val, ptr, sizeof(val));\n", out);
165 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);181 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
...@@ -199,39 +215,39 @@ int main(int argc, char **argv) {...@@ -199,39 +215,39 @@ int main(int argc, char **argv) {
199 " return i64_ctz(lhs);\n"215 " return i64_ctz(lhs);\n"
200 "}\n"216 "}\n"
201 "\n"217 "\n"
202 "static void store16_align0(uint8_t *ptr, uint16_t val) {\n", out);218 "void store16_align0(uint8_t *ptr, uint16_t val) {\n", out);
203 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);219 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
204 fputs(" memcpy(ptr, &val, sizeof(val));\n"220 fputs(" memcpy(ptr, &val, sizeof(val));\n"
205 "}\n"221 "}\n"
206 "static void store16_align1(uint16_t *ptr, uint16_t val) {\n", out);222 "void store16_align1(uint16_t *ptr, uint16_t val) {\n", out);
207 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);223 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
208 fputs(" memcpy(ptr, &val, sizeof(val));\n"224 fputs(" memcpy(ptr, &val, sizeof(val));\n"
209 "}\n"225 "}\n"
210 "static void store32_align0(uint8_t *ptr, uint32_t val) {\n", out);226 "void store32_align0(uint8_t *ptr, uint32_t val) {\n", out);
211 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);227 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
212 fputs(" memcpy(ptr, &val, sizeof(val));\n"228 fputs(" memcpy(ptr, &val, sizeof(val));\n"
213 "}\n"229 "}\n"
214 "static void store32_align1(uint16_t *ptr, uint32_t val) {\n", out);230 "void store32_align1(uint16_t *ptr, uint32_t val) {\n", out);
215 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);231 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
216 fputs(" memcpy(ptr, &val, sizeof(val));\n"232 fputs(" memcpy(ptr, &val, sizeof(val));\n"
217 "}\n"233 "}\n"
218 "static void store32_align2(uint32_t *ptr, uint32_t val) {\n", out);234 "void store32_align2(uint32_t *ptr, uint32_t val) {\n", out);
219 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);235 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
220 fputs(" memcpy(ptr, &val, sizeof(val));\n"236 fputs(" memcpy(ptr, &val, sizeof(val));\n"
221 "}\n"237 "}\n"
222 "static void store64_align0(uint8_t *ptr, uint64_t val) {\n", out);238 "void store64_align0(uint8_t *ptr, uint64_t val) {\n", out);
223 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);239 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
224 fputs(" memcpy(ptr, &val, sizeof(val));\n"240 fputs(" memcpy(ptr, &val, sizeof(val));\n"
225 "}\n"241 "}\n"
226 "static void store64_align1(uint16_t *ptr, uint64_t val) {\n", out);242 "void store64_align1(uint16_t *ptr, uint64_t val) {\n", out);
227 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);243 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
228 fputs(" memcpy(ptr, &val, sizeof(val));\n"244 fputs(" memcpy(ptr, &val, sizeof(val));\n"
229 "}\n"245 "}\n"
230 "static void store64_align2(uint32_t *ptr, uint64_t val) {\n", out);246 "void store64_align2(uint32_t *ptr, uint64_t val) {\n", out);
231 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);247 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
232 fputs(" memcpy(ptr, &val, sizeof(val));\n"248 fputs(" memcpy(ptr, &val, sizeof(val));\n"
233 "}\n"249 "}\n"
234 "static void store64_align3(uint64_t *ptr, uint64_t val) {\n", out);250 "void store64_align3(uint64_t *ptr, uint64_t val) {\n", out);
235 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);251 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
236 fputs(" memcpy(ptr, &val, sizeof(val));\n"252 fputs(" memcpy(ptr, &val, sizeof(val));\n"
237 "}\n"253 "}\n"