diff --git a/uppsrc/ide/Debug.cpp b/uppsrc/ide/Debug.cpp index b4ee9ebb1..fbd22dec4 100644 --- a/uppsrc/ide/Debug.cpp +++ b/uppsrc/ide/Debug.cpp @@ -265,10 +265,9 @@ void Ide::BuildAndExtDebugFile() } One GdbCreate(One&& host, const String& exefile, const String& cmdline, bool console); -One Gdb_MI2Create(One&& host, const String& exefile, const String& cmdline, bool console); + #ifdef PLATFORM_WIN32 -One CdbCreate(One&& host, const String& exefile, const String& cmdline); -One PdbCreate(One&& host, const String& exefile, const String& cmdline); +One PdbCreate(One&& host, const String& exefile, const String& cmdline, bool clang); #endif void Ide::BuildAndDebug(bool runto) @@ -297,7 +296,7 @@ void Ide::BuildAndDebug(bool runto) #ifdef PLATFORM_WIN32 if(findarg(builder, "GCC", "CLANG") < 0 || bm.Get("DEBUG_OPTIONS", String()).Find("-gcodeview") >= 0) // llvm-mingw can generate pdb symbolic info - debugger = PdbCreate(pick(host), target, runarg); + debugger = PdbCreate(pick(host), target, runarg, builder == "CLANG"); else #endif debugger = GdbCreate(pick(host), target, runarg, console); diff --git a/uppsrc/ide/Debuggers/Pdb.cpp b/uppsrc/ide/Debuggers/Pdb.cpp index 64b82ada1..76c181025 100644 --- a/uppsrc/ide/Debuggers/Pdb.cpp +++ b/uppsrc/ide/Debuggers/Pdb.cpp @@ -141,7 +141,7 @@ INITBLOCK RegisterGlobalConfig(CONFIGNAME); } -bool Pdb::Create(One local, const String& exefile, const String& cmdline) +bool Pdb::Create(One local, const String& exefile, const String& cmdline, bool clang_) { STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); @@ -154,6 +154,8 @@ bool Pdb::Create(One local, const String& exefile, const String& cmdline) cl << exefile; if(!IsNull(cmdline)) cl << ' ' << cmdline; + + clang = clang_; Buffer cmd(cl.GetLength() + 1); memcpy(cmd, cl, cl.GetLength() + 1); @@ -438,10 +440,10 @@ Pdb::~Pdb() Stop(); } -One PdbCreate(One&& host, const String& exefile, const String& cmdline) +One PdbCreate(One&& host, const String& exefile, const String& cmdline, bool clang) { One dbg; - if(!dbg.Create().Create(pick(host), exefile, cmdline)) + if(!dbg.Create().Create(pick(host), exefile, cmdline, clang)) dbg.Clear(); return dbg; } diff --git a/uppsrc/ide/Debuggers/Pdb.h b/uppsrc/ide/Debuggers/Pdb.h index 20da5dff3..aaaf723b9 100644 --- a/uppsrc/ide/Debuggers/Pdb.h +++ b/uppsrc/ide/Debuggers/Pdb.h @@ -193,6 +193,7 @@ struct Pdb : Debugger, ParentCtrl { HWND hWnd; VectorMap bp_set; // breakpoints active for single RunToException + bool clang; // we are in clang toolchain bool win64; // debugee is 64-bit, always false in 32-bit exe Context context; @@ -386,6 +387,7 @@ struct Pdb : Debugger, ParentCtrl { Val GetAttr(Pdb::Val record, const String& id); int64 GetInt64Attr(Pdb::Val v, const char *a); int GetIntAttr(Pdb::Val v, const char *a) { return (int)GetInt64Attr(v, a); } + byte GetByteAttr(Pdb::Val v, const char *a) { return (byte)GetInt64Attr(v, a); } Val At(Pdb::Val val, int i); Val At(Pdb::Val record, const char *id, int i); int IntAt(Pdb::Val record, const char *id, int i); @@ -497,7 +499,7 @@ struct Pdb : Debugger, ParentCtrl { void Tab(); - bool Create(One host, const String& exefile, const String& cmdline); + bool Create(One local, const String& exefile, const String& cmdline, bool clang_); void SerializeSession(Stream& s); diff --git a/uppsrc/ide/Debuggers/Pretty.cpp b/uppsrc/ide/Debuggers/Pretty.cpp index c8730cba8..7478f80ab 100644 --- a/uppsrc/ide/Debuggers/Pretty.cpp +++ b/uppsrc/ide/Debuggers/Pretty.cpp @@ -268,14 +268,32 @@ void Pdb::PrettyStdVector(Pdb::Val val, const Vector& tparam, int64 from void Pdb::PrettyStdString(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p) { - Val q = GetAttr(GetAttr(val, "_Mypair"), "_Myval2"); + adr_t a; + int size; bool w = tparam[0] == "wchar_t"; - int size = GetIntAttr(q, "_Mysize"); - int res = GetIntAttr(q, "_Myres"); + if(HasAttr(val, "__r_")) { // CLANG variant + Val r = GetAttr(GetAttr(val, "__r_"), "__value_"); + Val s = GetAttr(r, "__s"); + size = GetByteAttr(s, "__size_"); + if(size & 1) { + Val l = GetAttr(r, "__l"); + size = GetIntAttr(l, "__size_"); + a = DeRef(GetAttr(l, "__data_")).address; + } + else { + size = size >> 1; + a = s.address + 1 + w; + } + } + else { + Val q = GetAttr(GetAttr(val, "_Mypair"), "_Myval2"); + int size = GetIntAttr(q, "_Mysize"); + int res = GetIntAttr(q, "_Myres"); + a = GetAttr(GetAttr(q, "_Bx"), "_Buf").address; + if(res >= (w ? 8 : 16)) + a = PeekPtr(a); + } p.data_count = size; - adr_t a = GetAttr(GetAttr(q, "_Bx"), "_Buf").address; - if(res >= (w ? 8 : 16)) - a = PeekPtr(a); p.data_type << (w ? "short int" : "char"); int sz = w + 1; for(int i = 0; i < count; i++) diff --git a/uppsrc/ide/Debuggers/Sym.cpp b/uppsrc/ide/Debuggers/Sym.cpp index 0eba97958..0e03b9d7d 100644 --- a/uppsrc/ide/Debuggers/Sym.cpp +++ b/uppsrc/ide/Debuggers/Sym.cpp @@ -226,6 +226,10 @@ BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserCon DDUMP(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE); DDUMP(pSym->Register == CV_ALLREG_VFRAME); DDUMP(pSym->Register); + DDUMP(pSym->Scope); + DDUMP(pSym->Value); + DDUMP(pSym->ModBase); + DDUMPHEX((adr_t)pSym->Address); #endif bool param = pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER; @@ -241,7 +245,7 @@ BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserCon v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif - v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); + v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP) - 4 * c.pdb->clang; // Workaround for supposed clang/win32 issue } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); @@ -250,7 +254,6 @@ BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserCon if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE) v.address += c.frame; - LLOG("LOCAL " << pSym->Name << ": " << Format64Hex(v.address)); c.pdb->TypeVal(v, pSym->TypeIndex, (adr_t)pSym->ModBase); if(param && v.udt && v.ref == 0 && c.pdb->win64) { // dbghelp.dll incorrectly does not report pointer for (copied) value struct params v.ref++; @@ -258,6 +261,7 @@ BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserCon } v.reported_size = pSym->Size; v.context = c.context; + LLOG("LOCAL " << c.pdb->GetType(v.type).name << " " << pSym->Name << ": " << Format64Hex(v.address)); return TRUE; } @@ -275,6 +279,7 @@ void Pdb::GetLocals(Frame& frame, Context& context, VectorMap& SymEnumSymbols(hProcess, 0, 0, &EnumLocals, &c); param = pick(c.param); local = pick(c.local); + LLOG("==========================="); } BOOL CALLBACK Pdb::EnumGlobals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserContext) diff --git a/uppsrc/ide/FindInFiles.cpp b/uppsrc/ide/FindInFiles.cpp index 0296ce873..2abd4f90d 100644 --- a/uppsrc/ide/FindInFiles.cpp +++ b/uppsrc/ide/FindInFiles.cpp @@ -121,7 +121,7 @@ void Ide::AddFoundFile(const String& fn, int ln, const String& line, int pos, in f.len = count; f.kind = 0; f.message = "\1" + EditorSyntax::GetSyntaxForFilename(fn) + "\1" + - AsString(pos) + "\1" + AsString(count) + "\1" + line; + AsString(pos) + "\1" + AsString(count) + "\1" + (line.GetCount() > 300 ? line.Mid(0, 300) : line); FFound().Add(fn, ln, f.message, RawToValue(f)); } diff --git a/uppsrc/ide/InstantSetup.cpp b/uppsrc/ide/InstantSetup.cpp index be109901c..a0c3e9795 100644 --- a/uppsrc/ide/InstantSetup.cpp +++ b/uppsrc/ide/InstantSetup.cpp @@ -121,13 +121,88 @@ void bmSet(VectorMap& bm, const char *id, const String& val) void InstantSetup() { - DirFinder df; - + bool dirty = false; String default_method; - bool dirty = false; + String bin = GetExeDirFile("bin"); + + if(DirectoryExists(bin + "/clang")) // hopefully deprecated, but keep it for now + for(int x64 = 0; x64 < 2; x64++) { + String method = x64 ? "CLANGx64" : "CLANG"; + #ifdef INSTANT_TESTING + method << "Test"; + #endif + VectorMap bm = GetMethodVars(method); + Vector bins = Split(bm.Get("PATH", ""), ';'); + Vector incs = Split(bm.Get("INCLUDE", ""), ';'); + Vector libs = Split(bm.Get("LIB", ""), ';'); + #ifdef INSTANT_TESTING + if(CheckDirs(bins, 3) && CheckDirs(incs, 2) && CheckDirs(libs, 2)) { + if(!x64) + default_method = Nvl(default_method, method); + continue; + } + #endif + + bmSet(bm, "BUILDER", "CLANG"); + bmSet(bm, "COMPILER", x64 ? "" : "i686-w64-mingw32-c++"); + bmSet(bm, "COMMON_OPTIONS", ""); + bmSet(bm, "COMMON_CPP_OPTIONS", ""); + bmSet(bm, "COMMON_C_OPTIONS", ""); + bmSet(bm, "COMMON_LINK", ""); + bmSet(bm, "COMMON_FLAGS", ""); + bmSet(bm, "DEBUG_INFO", "2"); + bmSet(bm, "DEBUG_BLITZ", "1"); + bmSet(bm, "DEBUG_LINKMODE", "0"); + bmSet(bm, "DEBUG_OPTIONS", "-O0 -g -gcodeview -fno-limit-debug-info"); + bmSet(bm, "DEBUG_FLAGS", ""); + bmSet(bm, "DEBUG_LINK", "-Wl,-pdb= -Wl,--stack,20000000"); + bmSet(bm, "RELEASE_BLITZ", ""); + bmSet(bm, "RELEASE_LINKMODE", "0"); + bmSet(bm, "RELEASE_OPTIONS", "-O3 "); + bmSet(bm, "RELEASE_FLAGS", ""); + bmSet(bm, "RELEASE_LINK", "-Wl,--stack,20000000"); + bmSet(bm, "DEBUGGER", "gdb"); + bmSet(bm, "ALLOW_PRECOMPILED_HEADERS", "1"); + bmSet(bm, "DISABLE_BLITZ", ""); + + // bmSet(bm, "LINKMODE_LOCK", "0"); + + String clang = bin + "/clang"; + + bins.At(0) = clang + "/bin"; + bins.At(1) = clang + (x64 ? "/x86_64-w64-mingw32/bin" : "/i686-w64-mingw32/bin"); + bins.At(2) = bin + (x64 ? "/openssl/bin64" : "/openssl/bin32"); + bins.At(3) = GetExeDirFile(x64 ? "bin/SDL2/lib/x64" : "bin/SDL2/lib/x86"); + bins.At(4) = GetExeDirFile(x64 ? "bin/pgsql/x64/bin" : "bin/pgsql/x86/bin"); + bins.At(5) = GetExeDirFile(x64 ? "bin/mysql/lib64" : "bin/mysql/lib32"); + + incs.At(0) = clang + "/include"; + incs.At(1) = bin + "/openssl/include"; + incs.At(2) = GetExeDirFile("bin/SDL2/include"); + incs.At(3) = GetExeDirFile(x64 ? "bin/pgsql/x64/include" : "bin/pgsql/x86/include"); + incs.At(4) = GetExeDirFile(x64 ? "bin/mysql/include" : "bin/mysql/include"); + + libs.At(0) = clang + "/lib"; + libs.At(1) = bin + (x64 ? "/openssl/lib64" : "/openssl/lib32");; + libs.At(2) = GetExeDirFile(x64 ? "bin/SDL2/lib/x64" : "bin/SDL2/lib/x86"); + libs.At(3) = GetExeDirFile(x64 ? "bin/pgsql/x64/lib" : "bin/pgsql/x86/lib"); + libs.At(4) = GetExeDirFile(x64 ? "bin/mysql/lib64" : "bin/mysql/lib32"); + + bm.GetAdd("PATH") = Join(bins, ";"); + bm.GetAdd("INCLUDE") = Join(incs, ";"); + bm.GetAdd("LIB") = Join(libs, ";"); + + SaveVarFile(ConfigFile(method + ".bm"), bm); + dirty = true; + + if(x64) + default_method = Nvl(default_method, method); + } + enum { VS_2015, VS_2017, BT_2017, VS_2019, BT_2019 }; + DirFinder df; for(int version = VS_2015; version <= BT_2019; version++) for(int x64 = 0; x64 < 2; x64++) { @@ -155,8 +230,8 @@ void InstantSetup() Vector libs = Split(bm.Get("LIB", ""), ';'); #ifdef INSTANT_TESTING if(CheckDirs(bins, 2) && CheckDirs(incs, 4) && CheckDirs(libs, 3)) { - if(!x64) - default_method = x86method; + if(x64) + default_method = Nvl(default_method, x86method); continue; } @@ -303,84 +378,6 @@ void InstantSetup() } } - String bin = GetExeDirFile("bin"); - - if(DirectoryExists(bin + "/clang")) // hopefully deprecated, but keep it for now - for(int x64 = 0; x64 < 2; x64++) { - String method = x64 ? "CLANGx64" : "CLANG"; - #ifdef INSTANT_TESTING - method << "Test"; - #endif - VectorMap bm = GetMethodVars(method); - - Vector bins = Split(bm.Get("PATH", ""), ';'); - Vector incs = Split(bm.Get("INCLUDE", ""), ';'); - Vector libs = Split(bm.Get("LIB", ""), ';'); - #ifdef INSTANT_TESTING - if(CheckDirs(bins, 3) && CheckDirs(incs, 2) && CheckDirs(libs, 2)) { - if(!x64) - default_method = Nvl(default_method, method); - continue; - } - #endif - - bmSet(bm, "BUILDER", "CLANG"); - bmSet(bm, "COMPILER", x64 ? "" : "i686-w64-mingw32-c++"); - bmSet(bm, "COMMON_OPTIONS", ""); - bmSet(bm, "COMMON_CPP_OPTIONS", ""); - bmSet(bm, "COMMON_C_OPTIONS", ""); - bmSet(bm, "COMMON_LINK", ""); - bmSet(bm, "COMMON_FLAGS", ""); - bmSet(bm, "DEBUG_INFO", "2"); - bmSet(bm, "DEBUG_BLITZ", "1"); - bmSet(bm, "DEBUG_LINKMODE", "0"); - bmSet(bm, "DEBUG_OPTIONS", "-O0 -g -gcodeview"); - bmSet(bm, "DEBUG_FLAGS", ""); - bmSet(bm, "DEBUG_LINK", "-Wl,-pdb= -Wl,--stack,20000000"); - bmSet(bm, "RELEASE_BLITZ", ""); - bmSet(bm, "RELEASE_LINKMODE", "0"); - bmSet(bm, "RELEASE_OPTIONS", "-O3 "); - bmSet(bm, "RELEASE_FLAGS", ""); - bmSet(bm, "RELEASE_LINK", "-Wl,--stack,20000000"); - bmSet(bm, "DEBUGGER", "gdb"); - bmSet(bm, "ALLOW_PRECOMPILED_HEADERS", "1"); - bmSet(bm, "DISABLE_BLITZ", ""); - - // bmSet(bm, "LINKMODE_LOCK", "0"); - - String clang = bin + "/clang"; - - bins.At(0) = clang + "/bin"; - bins.At(1) = clang + (x64 ? "/x86_64-w64-mingw32/bin" : "/i686-w64-mingw32/bin"); - bins.At(2) = bin + (x64 ? "/openssl/bin64" : "/openssl/bin32"); - bins.At(3) = GetExeDirFile(x64 ? "bin/SDL2/lib/x64" : "bin/SDL2/lib/x86"); - bins.At(4) = GetExeDirFile(x64 ? "bin/pgsql/x64/bin" : "bin/pgsql/x86/bin"); - bins.At(5) = GetExeDirFile(x64 ? "bin/mysql/lib64" : "bin/mysql/lib32"); - - incs.At(0) = clang + "/include"; - incs.At(1) = bin + "/openssl/include"; - incs.At(2) = GetExeDirFile("bin/SDL2/include"); - incs.At(3) = GetExeDirFile(x64 ? "bin/pgsql/x64/include" : "bin/pgsql/x86/include"); - incs.At(4) = GetExeDirFile(x64 ? "bin/mysql/include" : "bin/mysql/include"); - - libs.At(0) = clang + "/lib"; - libs.At(1) = bin + (x64 ? "/openssl/lib64" : "/openssl/lib32");; - libs.At(2) = GetExeDirFile(x64 ? "bin/SDL2/lib/x64" : "bin/SDL2/lib/x86"); - libs.At(3) = GetExeDirFile(x64 ? "bin/pgsql/x64/lib" : "bin/pgsql/x86/lib"); - libs.At(4) = GetExeDirFile(x64 ? "bin/mysql/lib64" : "bin/mysql/lib32"); - - bm.GetAdd("PATH") = Join(bins, ";"); - bm.GetAdd("INCLUDE") = Join(incs, ";"); - bm.GetAdd("LIB") = Join(libs, ";"); - - SaveVarFile(ConfigFile(method + ".bm"), bm); - dirty = true; - - if(!x64) - default_method = Nvl(default_method, method); - } - - if(DirectoryExists(bin + "/mingw64")) // hopefully deprecated, but keep it for now for(int x64 = 0; x64 < 2; x64++) { String method = x64 ? "MINGWx64" : "MINGW";