1 //===-- lldb.cpp ------------------------------------------------*- C++ -*-===// 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 #include "lldb/lldb-private.h" 11 12 using namespace lldb; 13 using namespace lldb_private; 14 15 #if defined (__APPLE__) 16 extern "C" const unsigned char liblldb_coreVersionString[]; 17 #else 18 19 #include "clang/Basic/Version.h" 20 21 static const char * 22 GetLLDBRevision() 23 { 24 #ifdef LLDB_REVISION 25 return LLDB_REVISION; 26 #else 27 return NULL; 28 #endif 29 } 30 31 static const char * 32 GetLLDBRepository() 33 { 34 #ifdef LLDB_REPOSITORY 35 return LLDB_REPOSITORY; 36 #else 37 return NULL; 38 #endif 39 } 40 41 #endif 42 43 const char * 44 lldb_private::GetVersion () 45 { 46 #if defined (__APPLE__) 47 static char g_version_string[32]; 48 if (g_version_string[0] == '\0') 49 { 50 const char *version_string = ::strstr ((const char *)liblldb_coreVersionString, "PROJECT:"); 51 52 if (version_string) 53 version_string += sizeof("PROJECT:") - 1; 54 else 55 version_string = "unknown"; 56 57 const char *newline_loc = strchr(version_string, '\n'); 58 59 size_t version_len = sizeof(g_version_string) - 1; 60 61 if (newline_loc && 62 (newline_loc - version_string < static_cast<ptrdiff_t>(version_len))) 63 version_len = newline_loc - version_string; 64 65 ::snprintf(g_version_string, version_len + 1, "%s", version_string); 66 } 67 68 return g_version_string; 69 #else 70 // On Linux/FreeBSD/Windows, report a version number in the same style as the clang tool. 71 static std::string g_version_str; 72 if (g_version_str.empty()) 73 { 74 g_version_str += "lldb version "; 75 g_version_str += CLANG_VERSION_STRING; 76 const char * lldb_repo = GetLLDBRepository(); 77 if (lldb_repo) 78 { 79 g_version_str += " ("; 80 g_version_str += lldb_repo; 81 } 82 83 const char *lldb_rev = GetLLDBRevision(); 84 if (lldb_rev) 85 { 86 g_version_str += " revision "; 87 g_version_str += lldb_rev; 88 } 89 std::string clang_rev (clang::getClangRevision()); 90 if (clang_rev.length() > 0) 91 { 92 g_version_str += " clang revision "; 93 g_version_str += clang_rev; 94 } 95 std::string llvm_rev (clang::getLLVMRevision()); 96 if (llvm_rev.length() > 0) 97 { 98 g_version_str += " llvm revision "; 99 g_version_str += llvm_rev; 100 } 101 102 if (lldb_repo) 103 g_version_str += ")"; 104 } 105 return g_version_str.c_str(); 106 #endif 107 } 108