Introduce COMPlus_GDBJitElfDump (#13448)
authorJonghyun Park <parjong@gmail.com>
Fri, 18 Aug 2017 15:21:56 +0000 (00:21 +0900)
committerJan Vorlicek <janvorli@microsoft.com>
Fri, 18 Aug 2017 15:21:56 +0000 (17:21 +0200)
* Add COMPlus_GDBJitElfDump

* Fix Release build error

* Add flags in EEConfig

clrdefinitions.cmake
src/inc/clrconfigvalues.h
src/vm/CMakeLists.txt
src/vm/eeconfig.cpp
src/vm/eeconfig.h
src/vm/gdbjit.cpp
src/vm/gdbjit.h

index f6b8de4..1848e3b 100644 (file)
@@ -114,6 +114,12 @@ endif(FEATURE_DBGIPC)
 if(FEATURE_EVENT_TRACE)
     add_definitions(-DFEATURE_EVENT_TRACE=1)
 endif(FEATURE_EVENT_TRACE)
+if(FEATURE_GDBJIT)
+    add_definitions(-DFEATURE_GDBJIT)
+endif()
+if(FEATURE_GDBJIT_FRAME)
+    add_definitions(-DFEATURE_GDBJIT_FRAME)
+endif(FEATURE_GDBJIT_FRAME)
 if(CLR_CMAKE_PLATFORM_LINUX)
     add_definitions(-DFEATURE_PERFTRACING)
 endif(CLR_CMAKE_PLATFORM_LINUX)
index 14fc912..6cd82ae 100644 (file)
@@ -1054,6 +1054,13 @@ RETAIL_CONFIG_DWORD_INFO(EXTERNAL_AllowDComReflection, W("AllowDComReflection"),
 //
 RETAIL_CONFIG_DWORD_INFO(INTERNAL_PerformanceTracing, W("PerformanceTracing"), 0, "Enable/disable performance tracing.  Non-zero values enable tracing.")
 
+#ifdef FEATURE_GDBJIT
+//
+// GDBJIT
+//
+CONFIG_STRING_INFO(INTERNAL_GDBJitElfDump, W("GDBJitElfDump"), "Dump ELF for specified method")
+#endif
+
 //
 // Unknown
 // 
index 78f9eaf..e9f09ff 100644 (file)
@@ -30,11 +30,7 @@ if(FEATURE_GDBJIT)
     set(VM_SOURCES_GDBJIT
         gdbjit.cpp
     )
-    add_definitions(-DFEATURE_GDBJIT)
 endif(FEATURE_GDBJIT)
-if(FEATURE_GDBJIT_FRAME)
-    add_definitions(-DFEATURE_GDBJIT_FRAME)
-endif(FEATURE_GDBJIT_FRAME)
 
 if(FEATURE_JIT_PITCHING)
    add_definitions(-DFEATURE_JIT_PITCHING)
index d7c700e..44a9a13 100644 (file)
@@ -381,6 +381,10 @@ HRESULT EEConfig::Init()
     fTieredCompilation = false;
 #endif
     
+#if defined(FEATURE_GDBJIT) && defined(_DEBUG)
+    pszGDBJitElfDump = NULL;
+#endif // FEATURE_GDBJIT && _DEBUG
+
     // After initialization, register the code:#GetConfigValueCallback method with code:CLRConfig to let
     // CLRConfig access config files. This is needed because CLRConfig lives outside the VM and can't
     // statically link to EEConfig.
@@ -1236,6 +1240,14 @@ HRESULT EEConfig::sync()
     fTieredCompilation = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TieredCompilation) != 0;
 #endif
 
+#if defined(FEATURE_GDBJIT) && defined(_DEBUG)
+    {
+        LPWSTR pszGDBJitElfDumpW = NULL;
+        CLRConfig::GetConfigValue(CLRConfig::INTERNAL_GDBJitElfDump, &pszGDBJitElfDumpW);
+        pszGDBJitElfDump = NarrowWideChar(pszGDBJitElfDumpW);
+    }
+#endif // FEATURE_GDBJIT && _DEBUG
+
     return hr;
 }
 
index 872765b..e36ec00 100644 (file)
@@ -286,6 +286,18 @@ public:
     bool          TieredCompilation(void)           const {LIMITED_METHOD_CONTRACT;  return fTieredCompilation; }
 #endif
 
+#if defined(FEATURE_GDBJIT) && defined(_DEBUG)
+    inline bool ShouldDumpElfOnMethod(LPCUTF8 methodName) const
+    {
+        CONTRACTL {
+            NOTHROW;
+            GC_NOTRIGGER;
+            PRECONDITION(CheckPointer(methodName, NULL_OK));
+        } CONTRACTL_END
+        return RegexOrExactMatch(pszGDBJitElfDump, methodName);
+    }
+#endif // FEATURE_GDBJIT && _DEBUG
+
     BOOL PInvokeRestoreEsp(BOOL fDefault) const
     {
         LIMITED_METHOD_CONTRACT;
@@ -1098,6 +1110,10 @@ private: //----------------------------------------------------------------
     bool fTieredCompilation;
 #endif
 
+#if defined(FEATURE_GDBJIT) && defined(_DEBUG)
+    LPCUTF8 pszGDBJitElfDump;
+#endif // FEATURE_GDBJIT && _DEBUG
+
 public:
 
     HRESULT GetConfiguration_DontUse_(__in_z LPCWSTR pKey, ConfigSearch direction, __deref_out_opt LPCWSTR* value);
index 1d0bcc8..f5f95ef 100644 (file)
 
 __declspec(thread) bool tls_isSymReaderInProgress = false;
 
+#ifdef _DEBUG
+static void DumpElf(const char* methodName, const char *addr, size_t size)
+{
+    char dump[1024] = { 0, };
+
+    strcat(dump, methodName);
+    strcat(dump, ".o");
+
+    FILE *f = fopen(dump,  "wb");
+    fwrite(addr, sizeof(char), size, f);
+    fclose(f);
+}
+#endif
+
 TypeInfoBase*
 GetTypeInfoFromTypeHandle(TypeHandle typeHandle,
                           NotifyGdb::PTK_TypeInfoMap pTypeMap,
@@ -2067,7 +2081,7 @@ class Elf_Builder
         void Finalize(void);
 
     public:
-        char *Export(UINT64 *len);
+        char *Export(size_t *len);
 };
 
 Elf_Builder::Elf_Builder()
@@ -2167,7 +2181,7 @@ void Elf_Builder::CloseSection()
     m_Curr = nullptr;
 }
 
-char *Elf_Builder::Export(UINT64 *pLen)
+char *Elf_Builder::Export(size_t *pLen)
 {
     unsigned int len = m_Buffer.GetPos();
     const char  *src = m_Buffer.GetPtr();
@@ -2473,12 +2487,27 @@ void NotifyGdb::OnMethodPrepared(MethodDesc* methodDescPtr)
 
     elfBuilder.Finalize();
 
+    char   *symfile_addr = NULL;
+    size_t  symfile_size = 0;
+
+    symfile_addr = elfBuilder.Export(&symfile_size);
+
+#ifdef _DEBUG
+    LPCUTF8 methodName = methodDescPtr->GetName();
+
+    if (g_pConfig->ShouldDumpElfOnMethod(methodName))
+    {
+        DumpElf(methodName, symfile_addr, symfile_size);
+    }
+#endif
+
     /* Create GDB JIT structures */
     NewHolder<jit_code_entry> jit_symbols = new jit_code_entry;
 
     /* Fill the new entry */
     jit_symbols->next_entry = jit_symbols->prev_entry = 0;
-    jit_symbols->symfile_addr = elfBuilder.Export(&jit_symbols->symfile_size);
+    jit_symbols->symfile_addr = symfile_addr;
+    jit_symbols->symfile_size = symfile_size;
 
     /* Link into list */
     jit_code_entry *head = __jit_debug_descriptor.first_entry;
@@ -3266,19 +3295,6 @@ void NotifyGdb::SplitPathname(const char* path, const char*& pathName, const cha
     }
 }
 
-#ifdef _DEBUG
-void NotifyGdb::DumpElf(const char* methodName, const MemBuf& elfFile)
-{
-    char dump[1024];
-    strcpy(dump, "./");
-    strcat(dump, methodName);
-    strcat(dump, ".o");
-    FILE *f = fopen(dump,  "wb");
-    fwrite(elfFile.MemPtr, sizeof(char),elfFile.MemSize, f);
-    fclose(f);
-}
-#endif
-
 /* ELF 32bit header */
 Elf32_Ehdr::Elf32_Ehdr()
 {
index 533c496..1548a70 100644 (file)
@@ -430,9 +430,6 @@ private:
     static void SplitPathname(const char* path, const char*& pathName, const char*& fileName);
     static bool CollectCalledMethods(CalledMethod* pCM, TADDR nativeCode, FunctionMemberPtrArrayHolder &method,
                                      NewArrayHolder<Elf_Symbol> &symbolNames, int &symbolCount);
-#ifdef _DEBUG
-    static void DumpElf(const char* methodName, const MemBuf& buf);
-#endif
 };
 
 class FunctionMember: public TypeMember