30#if !defined(__MINGW32__)
31#pragma comment(lib, "psapi.lib")
32#pragma comment(lib, "shell32.lib")
43 static_assert(
sizeof(Pid) >=
sizeof(DWORD),
44 "Process::Pid should be big enough to store DWORD");
45 return Pid(::GetCurrentProcessId());
51static unsigned computePageSize() {
55 GetNativeSystemInfo(&
info);
58 return static_cast<unsigned>(
info.dwPageSize);
62 static unsigned Ret = computePageSize();
72 while (_heapwalk(&hinfo) == _HEAPOK)
79 std::chrono::nanoseconds &user_time,
80 std::chrono::nanoseconds &sys_time) {
81 elapsed = std::chrono::system_clock::now();
84 FILETIME ProcCreate, ProcExit, KernelTime, UserTime;
85 if (GetProcessTimes(GetCurrentProcess(), &ProcCreate, &ProcExit, &KernelTime,
107 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
108 SEM_NOOPENFILEERRORBOX);
118 if (windows::UTF8ToUTF16(Name, NameUTF16))
125 size_t Size = MAX_PATH;
128 SetLastError(NO_ERROR);
130 if (
Size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)
139 if (windows::UTF16ToUTF8(Buf.
data(),
Size, Res))
141 return std::string(Res.
data());
146static std::error_code WildcardExpand(
StringRef Arg,
163 EC = windows::UTF8ToUTF16(Arg, ArgW);
171 WIN32_FIND_DATAW FileData;
172 HANDLE FindHandle = FindFirstFileW(ArgW.
data(), &FileData);
173 if (FindHandle == INVALID_HANDLE_VALUE) {
181 const int DirSize = Dir.
size();
185 EC = windows::UTF16ToUTF8(FileData.cFileName, wcslen(FileData.cFileName),
194 }
while (FindNextFileW(FindHandle, &FileData));
196 FindClose(FindHandle);
229 return std::error_code();
235 const wchar_t *CmdW = GetCommandLineW();
239 EC = windows::UTF16ToUTF8(CmdW, wcslen(CmdW), Cmd);
247 for (
const char *Arg : TmpArgs) {
248 EC = WildcardExpand(Arg, Args, Saver);
253 if (
Args.size() == 0)
254 return std::make_error_code(std::errc::invalid_argument);
259 EC = GetExecutableName(Filename);
265 return std::error_code();
269 return std::error_code();
275 return std::error_code();
286 return (GetConsoleMode((HANDLE)_get_osfhandle(fd), &
Mode) != 0);
290 unsigned Columns = 0;
291 CONSOLE_SCREEN_BUFFER_INFO csbi;
292 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
293 Columns = csbi.dwSize.X;
298 unsigned Columns = 0;
299 CONSOLE_SCREEN_BUFFER_INFO csbi;
300 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi))
301 Columns = csbi.dwSize.X;
307 return FileDescriptorIsDisplayed(fd);
314static bool UseANSI =
false;
316#if defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
318 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
320 GetConsoleMode(Console, &
Mode);
321 Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
322 SetConsoleMode(Console,
Mode);
334 DefaultColors() : defaultColor(GetCurrentColor()) {}
335 static unsigned GetCurrentColor() {
336 CONSOLE_SCREEN_BUFFER_INFO csbi;
337 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
338 return csbi.wAttributes;
341 WORD operator()()
const {
return defaultColor; }
344DefaultColors defaultColors;
346WORD fg_color(WORD color) {
347 return color & (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY |
351WORD bg_color(WORD color) {
352 return color & (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY |
363 WORD colors = DefaultColors::GetCurrentColor();
365 colors |= BACKGROUND_INTENSITY;
367 colors |= FOREGROUND_INTENSITY;
368 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
374 return colorcodes[bg ? 1 : 0][bold ? 1 : 0][code & 15];
376 WORD current = DefaultColors::GetCurrentColor();
379 colors = ((code & 1) ? BACKGROUND_RED : 0) |
380 ((code & 2) ? BACKGROUND_GREEN : 0) |
381 ((code & 4) ? BACKGROUND_BLUE : 0);
383 colors |= BACKGROUND_INTENSITY;
384 colors |= fg_color(current);
386 colors = ((code & 1) ? FOREGROUND_RED : 0) |
387 ((code & 2) ? FOREGROUND_GREEN : 0) |
388 ((code & 4) ? FOREGROUND_BLUE : 0);
390 colors |= FOREGROUND_INTENSITY;
391 colors |= bg_color(current);
393 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
397static WORD GetConsoleTextAttribute(HANDLE hConsoleOutput) {
398 CONSOLE_SCREEN_BUFFER_INFO
info;
399 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &
info);
400 return info.wAttributes;
407 const WORD attributes =
408 GetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE));
410 const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN |
411 FOREGROUND_RED | FOREGROUND_INTENSITY;
412 const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN |
413 BACKGROUND_RED | BACKGROUND_INTENSITY;
414 const WORD color_mask = foreground_mask | background_mask;
416 WORD new_attributes =
417 ((attributes & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0) |
418 ((attributes & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0) |
419 ((attributes & FOREGROUND_RED) ? BACKGROUND_RED : 0) |
420 ((attributes & FOREGROUND_INTENSITY) ? BACKGROUND_INTENSITY : 0) |
421 ((attributes & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0) |
422 ((attributes & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0) |
423 ((attributes & BACKGROUND_RED) ? FOREGROUND_RED : 0) |
424 ((attributes & BACKGROUND_INTENSITY) ? FOREGROUND_INTENSITY : 0) | 0;
425 new_attributes = (attributes & ~color_mask) | (new_attributes & color_mask);
427 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), new_attributes);
434 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), defaultColors());
438static unsigned GetRandomNumberSeed() {
442 GetSystemTimeAsFileTime(&Time);
443 DWORD Pid = GetCurrentProcessId();
444 return hash_combine(Time.dwHighDateTime, Time.dwLowDateTime, Pid);
447static unsigned GetPseudoRandomNumber() {
451 static int x = (
static_cast<void>(::srand(GetRandomNumberSeed())), 0);
459 if (::CryptAcquireContextW(&HCPC, NULL, NULL, PROV_RSA_FULL,
460 CRYPT_VERIFYCONTEXT)) {
463 if (::CryptGenRandom(CryptoProvider,
sizeof(Ret),
464 reinterpret_cast<BYTE *
>(&Ret)))
469 return GetPseudoRandomNumber();
472typedef NTSTATUS(WINAPI *RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
473#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
475static RTL_OSVERSIONINFOEXW GetWindowsVer() {
476 auto getVer = []() -> RTL_OSVERSIONINFOEXW {
477 HMODULE hMod = ::GetModuleHandleW(L
"ntdll.dll");
481 (RtlGetVersionPtr)(
void *)::GetProcAddress(hMod,
"RtlGetVersion");
484 RTL_OSVERSIONINFOEXW
info{};
485 info.dwOSVersionInfoSize =
sizeof(
info);
486 NTSTATUS r = getVer((PRTL_OSVERSIONINFOW)&
info);
488 assert(r == STATUS_SUCCESS);
492 static RTL_OSVERSIONINFOEXW
info = getVer();
497 RTL_OSVERSIONINFOEXW
info = GetWindowsVer();
508 RTL_OSVERSIONINFOEXW
info = GetWindowsVer();
513 if (
info.wProductType == VER_NT_SERVER)
520[[noreturn]]
void Process::ExitNoCleanup(
int RetCode) {
521 TerminateProcess(GetCurrentProcess(), RetCode);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Prepare AGPR Alloc
This file defines the BumpPtrAllocator interface.
static bool coreFilesPrevented
static const char colorcodes[2][2][16][11]
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void resize_for_overwrite(size_type N)
Like resize, but T is POD, the new values won't be initialized.
void truncate(size_type N)
Like resize, but requires that N is less than size().
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
size_t find_first_of(char C, size_t From=0) const
Find the first character in the string that is C, or npos if not found.
static constexpr size_t npos
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
StringRef save(const char *S)
Represents a version number in the form major[.minor[.subminor[.build]]].
static LLVM_ABI void UseANSIEscapeCodes(bool enable)
Enables or disables whether ANSI escape sequences are used to output colors.
static LLVM_ABI std::error_code SafelyCloseFileDescriptor(int FD)
static LLVM_ABI 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 LLVM_ABI std::error_code FixupStandardFileDescriptors()
static LLVM_ABI Pid getProcessId()
Get the process's identifier.
static LLVM_ABI size_t GetMallocUsage()
Return process memory usage.
static LLVM_ABI bool ColorNeedsFlush()
Whether changing colors requires the output to be flushed.
static LLVM_ABI const char * ResetColor()
Resets the terminals colors, or returns an escape sequence to do so.
static LLVM_ABI unsigned GetRandomNumber()
Get the result of a process wide random number generator.
static LLVM_ABI bool FileDescriptorIsDisplayed(int fd)
This function determines if the given file descriptor is connected to a "tty" or "console" window.
static LLVM_ABI Expected< unsigned > getPageSize()
Get the process's page size.
static LLVM_ABI const char * OutputColor(char c, bool bold, bool bg)
This function returns the colorcode escape sequences.
static LLVM_ABI const char * OutputBold(bool bg)
Same as OutputColor, but only enables the bold attribute.
static LLVM_ABI unsigned StandardErrColumns()
This function determines the number of columns in the window if standard error is connected to a "tty...
static LLVM_ABI std::optional< std::string > GetEnv(StringRef name)
static LLVM_ABI bool FileDescriptorHasColors(int fd)
This function determines if the given file descriptor is displayd and supports colors.
static LLVM_ABI bool StandardInIsUserInput()
This function determines if the standard input is connected directly to a user's input (keyboard prob...
static LLVM_ABI void PreventCoreFiles()
This function makes the necessary calls to the operating system to prevent core files or any other ki...
static LLVM_ABI bool StandardErrHasColors()
This function determines whether the terminal connected to standard error supports colors.
static LLVM_ABI const char * OutputReverse()
This function returns the escape sequence to reverse forground and background colors.
static LLVM_ABI bool StandardErrIsDisplayed()
This function determines if the standard error is connected to a "tty" or "console" window.
static LLVM_ABI bool StandardOutHasColors()
This function determines whether the terminal connected to standard output supports colors.
static LLVM_ABI unsigned StandardOutColumns()
This function determines the number of columns in the window if standard output is connected to a "tt...
static LLVM_ABI bool StandardOutIsDisplayed()
This function determines if the standard output is connected to a "tty" or "console" window.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
LLVM_ABI void TokenizeWindowsCommandLineFull(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a Windows full command line, including command name at the start.
LLVM_ABI void remove_filename(SmallVectorImpl< char > &path, Style style=Style::native)
Remove the last component from path unless it is the root dir.
void make_preferred(SmallVectorImpl< char > &path, Style style=Style::native)
For Windows path styles, convert path to use the preferred path separators.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI std::error_code GetCommandLineArguments(SmallVectorImpl< const char * > &Args, BumpPtrAllocator &Alloc)
std::chrono::nanoseconds toDuration(FILETIME Time)
std::chrono::time_point< std::chrono::system_clock, D > TimePoint
A time point on the system clock.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool RunningWindows8OrGreater()
Determines if the program is running on Windows 8 or newer.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
ScopedHandle< CryptContextTraits > ScopedCryptContext
LLVM_ABI llvm::VersionTuple GetWindowsOSVersion()
Returns the Windows version as Major.Minor.0.BuildNumber.
LLVM_ABI bool RunningWindows11OrGreater()
Determines if the program is running on Windows 11 or Windows Server 2022.
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI std::error_code mapWindowsError(unsigned EV)
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
std::error_code errnoAsErrorCode()
Helper to get errno as an std::error_code.