blob: b3e16b43bf5bc596f576567943dfa9d682546873 [file] [log] [blame]
//===-- sanitizer_common.cc -----------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is shared between AddressSanitizer and ThreadSanitizer
// run-time libraries.
//===----------------------------------------------------------------------===//
#include "sanitizer_common.h"
#include "sanitizer_libc.h"
#include <stdlib.h>
namespace __sanitizer {
void RawWrite(const char *buffer) {
static const char *kRawWriteError = "RawWrite can't output requested buffer!";
uptr length = (uptr)internal_strlen(buffer);
if (length != internal_write(2, buffer, length)) {
internal_write(2, kRawWriteError, internal_strlen(kRawWriteError));
Die();
}
}
uptr ReadFileToBuffer(const char *file_name, char **buff,
uptr *buff_size, uptr max_len) {
const uptr kMinFileLen = kPageSize;
uptr read_len = 0;
*buff = 0;
*buff_size = 0;
// The files we usually open are not seekable, so try different buffer sizes.
for (uptr size = kMinFileLen; size <= max_len; size *= 2) {
fd_t fd = internal_open(file_name, /*write*/ false);
if (fd == kInvalidFd) return 0;
UnmapOrDie(*buff, *buff_size);
*buff = (char*)MmapOrDie(size, __FUNCTION__);
*buff_size = size;
// Read up to one page at a time.
read_len = 0;
bool reached_eof = false;
while (read_len + kPageSize <= size) {
uptr just_read = internal_read(fd, *buff + read_len, kPageSize);
if (just_read == 0) {
reached_eof = true;
break;
}
read_len += just_read;
}
internal_close(fd);
if (reached_eof) // We've read the whole file.
break;
}
return read_len;
}
static int comp(const void *p1, const void *p2) {
uptr v1 = *(uptr*)p1;
uptr v2 = *(uptr*)p2;
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
void SortArray(uptr *array, uptr size) {
qsort(array, size, sizeof(array[0]), &comp);
}
} // namespace __sanitizer