sanitizer_win.cc revision a25b3463477d2a825df4f656001fc07c594b35ac
17f9c5a220b2768a450696bbd157a0e6f2e9ceea3Alexey Samsonov//===-- sanitizer_win.cc --------------------------------------------------===//
2c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
3c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//                     The LLVM Compiler Infrastructure
4c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
5c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is distributed under the University of Illinois Open Source
6c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// License. See LICENSE.TXT for details.
7c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
8c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===//
9c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
10c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is shared between AddressSanitizer and ThreadSanitizer
11c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// run-time libraries and implements windows-specific functions from
12c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// sanitizer_libc.h.
13c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===//
14c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#ifdef _WIN32
15c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include <windows.h>
16c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
179929ffd1c4737d2c50829dcefcb0b8f1926a05ffAlexey Samsonov#include "sanitizer_common.h"
18c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include "sanitizer_libc.h"
19c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
20c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovnamespace __sanitizer {
21c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
22230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovint GetPid() {
23230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  return GetProcessId(GetCurrentProcess());
24230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
25230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
26a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonovvoid *MmapOrDie(uptr size, const char *mem_type) {
27230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  void *rv = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
28a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov  if (rv == 0) {
29a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    Report("ERROR: Failed to allocate 0x%zx (%zd) bytes of %s\n",
30a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov           size, size, mem_type);
31a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    CHECK("unable to mmap" && 0);
32a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov  }
33230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  return rv;
34230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
35230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
36230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovvoid UnmapOrDie(void *addr, uptr size) {
378c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  if (VirtualFree(addr, size, MEM_DECOMMIT) == 0) {
38a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    Report("ERROR: Failed to deallocate 0x%zx (%zd) bytes at address %p\n",
39a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov           size, size, addr);
40a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    CHECK("unable to unmap" && 0);
418c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  }
42230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
43230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
44c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovvoid *internal_mmap(void *addr, uptr length, int prot, int flags,
45c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov                    int fd, u64 offset) {
468c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
47c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}
48c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
491f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_munmap(void *addr, uptr length) {
508c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
511f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov}
521f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov
53a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovint internal_close(fd_t fd) {
548c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
55a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
56a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
57c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovfd_t internal_open(const char *filename, bool write) {
588c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
59c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}
60c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
61a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_read(fd_t fd, void *buf, uptr count) {
628c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
63a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
64a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
65a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_write(fd_t fd, const void *buf, uptr count) {
668c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  if (fd != 2)
678c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov    UNIMPLEMENTED();
68a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  HANDLE err = GetStdHandle(STD_ERROR_HANDLE);
69a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  if (err == 0)
70a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov    return 0;  // FIXME: this might not work on some apps.
71a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  DWORD ret;
72a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  if (!WriteFile(err, buf, count, &ret, 0))
73a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov    return 0;
74a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  return ret;
75a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
76a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
778e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovuptr internal_filesize(fd_t fd) {
788c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
798e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov}
808e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov
818e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovint internal_dup2(int oldfd, int newfd) {
828c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
838e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov}
848e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov
851f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_sscanf(const char *str, const char *format, ...) {
868c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
871f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov}
881f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov
89c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}  // namespace __sanitizer
90c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
91c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#endif  // _WIN32
92