28 #if (HAVE_LIBPSAPI != 1)
29 #error "libpsapi.a should be present"
31 #if (HAVE_LIBSHELL32 != 1)
32 #error "libshell32.a should be present"
35 #pragma comment(lib, "psapi.lib")
36 #pragma comment(lib, "shell32.lib")
55 static unsigned computePageSize() {
59 GetNativeSystemInfo(&info);
62 return static_cast<unsigned>(info.dwPageSize);
66 static unsigned Ret = computePageSize();
78 while (_heapwalk(&hinfo) == _HEAPOK)
85 std::chrono::nanoseconds &sys_time) {
88 FILETIME ProcCreate, ProcExit, KernelTime, UserTime;
89 if (GetProcessTimes(GetCurrentProcess(), &ProcCreate, &ProcExit, &KernelTime,
111 SetErrorMode(SEM_FAILCRITICALERRORS |
112 SEM_NOGPFAULTERRORBOX |
113 SEM_NOOPENFILEERRORBOX);
130 size_t Size = MAX_PATH;
146 return std::string(Res.
data());
153 ::memcpy(Buffer, S.
data(), S.
size());
154 Buffer[S.
size()] =
'\0';
159 static std::error_code
165 AllocateAndPush(ArgString, Args, Allocator);
166 return std::error_code();
171 static std::error_code
174 if (!wcspbrk(Arg,
L"*?")) {
176 return ConvertAndPushArg(Arg, Args, Allocator);
179 if (wcscmp(Arg,
L"/?") == 0 || wcscmp(Arg,
L"-?") == 0) {
181 return ConvertAndPushArg(Arg, Args, Allocator);
189 const int DirSize = Dir.
size();
195 WIN32_FIND_DATAW FileData;
196 HANDLE FindHandle = FindFirstFileW(Arg, &FileData);
197 if (FindHandle == INVALID_HANDLE_VALUE) {
198 return ConvertAndPushArg(Arg, Args, Allocator);
211 AllocateAndPush(Dir, Args, Allocator);
213 }
while (FindNextFileW(FindHandle, &FileData));
215 FindClose(FindHandle);
219 static std::error_code
241 wchar_t **UnicodeCommandLine =
242 CommandLineToArgvW(GetCommandLineW(), &ArgCount);
243 if (!UnicodeCommandLine)
251 wchar_t ModuleName[MAX_PATH];
252 int Length = ::GetModuleFileNameW(NULL, ModuleName, MAX_PATH);
253 if (0 < Length && Length < MAX_PATH)
254 UnicodeCommandLine[0] = ModuleName;
259 ec = ExpandShortFileName(UnicodeCommandLine[0], Args, ArgAllocator);
261 for (
int i = 1;
i < ArgCount && !ec; ++
i) {
262 ec = WildcardExpand(UnicodeCommandLine[
i], Args, ArgAllocator);
267 LocalFree(UnicodeCommandLine);
272 return std::error_code();
277 return std::error_code(errno, std::generic_category());
278 return std::error_code();
295 return (GetConsoleMode((HANDLE)_get_osfhandle(fd), &Mode) != 0);
299 unsigned Columns = 0;
300 CONSOLE_SCREEN_BUFFER_INFO csbi;
301 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
302 Columns = csbi.dwSize.X;
307 unsigned Columns = 0;
308 CONSOLE_SCREEN_BUFFER_INFO csbi;
309 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi))
310 Columns = csbi.dwSize.X;
327 static bool UseANSI =
false;
339 :defaultColor(GetCurrentColor()) {}
340 static unsigned GetCurrentColor() {
341 CONSOLE_SCREEN_BUFFER_INFO csbi;
342 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
343 return csbi.wAttributes;
346 WORD operator()()
const {
return defaultColor; }
349 DefaultColors defaultColors;
351 WORD fg_color(WORD color) {
352 return color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
353 FOREGROUND_INTENSITY | FOREGROUND_RED);
356 WORD bg_color(WORD color) {
357 return color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
358 BACKGROUND_INTENSITY | BACKGROUND_RED);
367 if (UseANSI)
return "\033[1m";
369 WORD colors = DefaultColors::GetCurrentColor();
371 colors |= BACKGROUND_INTENSITY;
373 colors |= FOREGROUND_INTENSITY;
374 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
379 if (UseANSI)
return colorcodes[bg?1:0][bold?1:0][code&7];
381 WORD current = DefaultColors::GetCurrentColor();
384 colors = ((code&1) ? BACKGROUND_RED : 0) |
385 ((code&2) ? BACKGROUND_GREEN : 0 ) |
386 ((code&4) ? BACKGROUND_BLUE : 0);
388 colors |= BACKGROUND_INTENSITY;
389 colors |= fg_color(current);
391 colors = ((code&1) ? FOREGROUND_RED : 0) |
392 ((code&2) ? FOREGROUND_GREEN : 0 ) |
393 ((code&4) ? FOREGROUND_BLUE : 0);
395 colors |= FOREGROUND_INTENSITY;
396 colors |= bg_color(current);
398 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
402 static WORD GetConsoleTextAttribute(HANDLE hConsoleOutput) {
403 CONSOLE_SCREEN_BUFFER_INFO
info;
404 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
405 return info.wAttributes;
409 if (UseANSI)
return "\033[7m";
412 = GetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE));
414 const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN |
415 FOREGROUND_RED | FOREGROUND_INTENSITY;
416 const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN |
417 BACKGROUND_RED | BACKGROUND_INTENSITY;
418 const WORD color_mask = foreground_mask | background_mask;
420 WORD new_attributes =
421 ((attributes & FOREGROUND_BLUE )?BACKGROUND_BLUE :0) |
422 ((attributes & FOREGROUND_GREEN )?BACKGROUND_GREEN :0) |
423 ((attributes & FOREGROUND_RED )?BACKGROUND_RED :0) |
424 ((attributes & FOREGROUND_INTENSITY)?BACKGROUND_INTENSITY:0) |
425 ((attributes & BACKGROUND_BLUE )?FOREGROUND_BLUE :0) |
426 ((attributes & BACKGROUND_GREEN )?FOREGROUND_GREEN :0) |
427 ((attributes & BACKGROUND_RED )?FOREGROUND_RED :0) |
428 ((attributes & BACKGROUND_INTENSITY)?FOREGROUND_INTENSITY:0) |
430 new_attributes = (attributes & ~color_mask) | (new_attributes & color_mask);
432 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), new_attributes);
437 if (UseANSI)
return "\033[0m";
438 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), defaultColors());
443 static void ReportLastErrorFatal(
const char *Msg) {
451 if (!::CryptAcquireContextW(&HCPC, NULL, NULL, PROV_RSA_FULL,
452 CRYPT_VERIFYCONTEXT))
453 ReportLastErrorFatal(
"Could not acquire a cryptographic context");
457 if (!::CryptGenRandom(CryptoProvider,
sizeof(Ret),
458 reinterpret_cast<BYTE *>(&Ret)))
459 ReportLastErrorFatal(
"Could not generate a random number");
void push_back(const T &Elt)
size_t capacity() const
Return the total number of elements in the currently allocated buffer.
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
static const char * ResetColor()
Resets the terminals colors, or returns an escape sequence to do so.
static const char * OutputColor(char c, bool bold, bool bg)
This function returns the colorcode escape sequences.
static bool StandardErrHasColors()
This function determines whether the terminal connected to standard error supports colors...
static bool FileDescriptorHasColors(int fd)
This function determines if the given file descriptor is displayd and supports colors.
static bool FileDescriptorIsDisplayed(int fd)
This function determines if the given file descriptor is connected to a "tty" or "console" window...
void reserve(size_type N)
This file defines the MallocAllocator and BumpPtrAllocator interfaces.
static std::error_code FixupStandardFileDescriptors()
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
static bool ColorNeedsFlush()
Whether changing colors requires the output to be flushed.
void remove_filename(SmallVectorImpl< char > &path)
Remove the last component from path unless it is the root dir.
static const char * OutputReverse()
This function returns the escape sequence to reverse forground and background colors.
static const char colorcodes[2][2][8][10]
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
static bool StandardInIsUserInput()
This function determines if the standard input is connected directly to a user's input (keyboard prob...
static bool StandardOutIsDisplayed()
This function determines if the standard output is connected to a "tty" or "console" window...
static void UseANSIEscapeCodes(bool enable)
Enables or disables whether ANSI escape sequences are used to output colors.
static unsigned StandardOutColumns()
This function determines the number of columns in the window if standard output is connected to a "tt...
static std::error_code GetArgumentVector(SmallVectorImpl< const char * > &Args, ArrayRef< const char * > ArgsFromMain, SpecificBumpPtrAllocator< char > &ArgAllocator)
This function returns a SmallVector containing the arguments passed from the operating system to the ...
static sys::TimePoint< std::chrono::seconds > now(bool Deterministic)
static bool coreFilesPrevented
Greedy Register Allocator
std::error_code mapWindowsError(unsigned EV)
std::error_code UTF8ToUTF16(StringRef utf8, SmallVectorImpl< wchar_t > &utf16)
T * Allocate(size_t num=1)
Allocate space for an array of objects without constructing them.
static size_t GetMallocUsage()
Return process memory usage.
std::error_code UTF16ToUTF8(const wchar_t *utf16, size_t utf16_len, SmallVectorImpl< char > &utf8)
static unsigned getPageSize()
static bool StandardErrIsDisplayed()
This function determines if the standard error is connected to a "tty" or "console" window...
static void PreventCoreFiles()
This function makes the necessary calls to the operating system to prevent core files or any other ki...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
static unsigned StandardErrColumns()
This function determines the number of columns in the window if standard error is connected to a "tty...
A BumpPtrAllocator that allows only elements of a specific type to be allocated.
static bool StandardOutHasColors()
This function determines whether the terminal connected to standard output supports colors...
bool MakeErrMsg(std::string *ErrMsg, const std::string &prefix)
static unsigned GetRandomNumber()
Get the result of a process wide random number generator.
void set_size(size_type N)
Set the array size to N, which the current array must have enough capacity for.
pointer data()
Return a pointer to the vector's buffer, even if empty().
std::chrono::microseconds toDuration(const struct timeval &TV)
Convert a struct timeval to a duration.
LLVM_ATTRIBUTE_ALWAYS_INLINE size_type size() const
Deduce function attributes
static void GetTimeUsage(TimePoint<> &elapsed, std::chrono::nanoseconds &user_time, std::chrono::nanoseconds &sys_time)
This static function will set user_time to the amount of CPU time spent in user (non-kernel) mode and...
static const char * OutputBold(bool bg)
Same as OutputColor, but only enables the bold attribute.
static std::error_code SafelyCloseFileDescriptor(int FD)
StringRef - Represent a constant reference to a string, i.e.
static Optional< std::string > GetEnv(StringRef name)