blob: b3e16b43bf5bc596f576567943dfa9d682546873 [file] [log] [blame]
Alexey Samsonovee072902012-06-06 09:26:25 +00001//===-- sanitizer_common.cc -----------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is shared between AddressSanitizer and ThreadSanitizer
11// run-time libraries.
12//===----------------------------------------------------------------------===//
13
14#include "sanitizer_common.h"
15#include "sanitizer_libc.h"
Dmitry Vyukov5dc3f012012-07-05 09:23:37 +000016#include <stdlib.h>
Alexey Samsonove4a88982012-06-15 07:00:31 +000017
Alexey Samsonovee072902012-06-06 09:26:25 +000018namespace __sanitizer {
19
20void RawWrite(const char *buffer) {
21 static const char *kRawWriteError = "RawWrite can't output requested buffer!";
22 uptr length = (uptr)internal_strlen(buffer);
23 if (length != internal_write(2, buffer, length)) {
24 internal_write(2, kRawWriteError, internal_strlen(kRawWriteError));
25 Die();
26 }
27}
28
Alexey Samsonovfe44fbd2012-06-07 05:38:26 +000029uptr ReadFileToBuffer(const char *file_name, char **buff,
30 uptr *buff_size, uptr max_len) {
31 const uptr kMinFileLen = kPageSize;
32 uptr read_len = 0;
33 *buff = 0;
34 *buff_size = 0;
35 // The files we usually open are not seekable, so try different buffer sizes.
36 for (uptr size = kMinFileLen; size <= max_len; size *= 2) {
37 fd_t fd = internal_open(file_name, /*write*/ false);
38 if (fd == kInvalidFd) return 0;
39 UnmapOrDie(*buff, *buff_size);
40 *buff = (char*)MmapOrDie(size, __FUNCTION__);
41 *buff_size = size;
42 // Read up to one page at a time.
43 read_len = 0;
44 bool reached_eof = false;
45 while (read_len + kPageSize <= size) {
46 uptr just_read = internal_read(fd, *buff + read_len, kPageSize);
47 if (just_read == 0) {
48 reached_eof = true;
49 break;
50 }
51 read_len += just_read;
52 }
53 internal_close(fd);
54 if (reached_eof) // We've read the whole file.
55 break;
56 }
57 return read_len;
58}
59
Dmitry Vyukov5dc3f012012-07-05 09:23:37 +000060static int comp(const void *p1, const void *p2) {
61 uptr v1 = *(uptr*)p1;
62 uptr v2 = *(uptr*)p2;
63 if (v1 < v2)
64 return -1;
65 else if (v1 > v2)
66 return 1;
67 else
68 return 0;
69}
70
Alexey Samsonove4a88982012-06-15 07:00:31 +000071void SortArray(uptr *array, uptr size) {
Dmitry Vyukov5dc3f012012-07-05 09:23:37 +000072 qsort(array, size, sizeof(array[0]), &comp);
Alexey Samsonove4a88982012-06-15 07:00:31 +000073}
74
Alexey Samsonovee072902012-06-06 09:26:25 +000075} // namespace __sanitizer