summaryrefslogtreecommitdiff
path: root/src/vm/gdbjit.cpp
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-08-19 00:21:56 +0900
committerJan Vorlicek <janvorli@microsoft.com>2017-08-18 17:21:56 +0200
commitc40a59ba595ced53667333b017b30f4cdd05a55f (patch)
treed66095c6a424436304516474f2429922143f9de9 /src/vm/gdbjit.cpp
parente4b2e7063d285e76243e65ba84d1d45ab60abaca (diff)
downloadcoreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.tar.gz
coreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.tar.bz2
coreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.zip
Introduce COMPlus_GDBJitElfDump (#13448)
* Add COMPlus_GDBJitElfDump * Fix Release build error * Add flags in EEConfig
Diffstat (limited to 'src/vm/gdbjit.cpp')
-rw-r--r--src/vm/gdbjit.cpp48
1 files changed, 32 insertions, 16 deletions
diff --git a/src/vm/gdbjit.cpp b/src/vm/gdbjit.cpp
index 1d0bcc8435..f5f95efd4d 100644
--- a/src/vm/gdbjit.cpp
+++ b/src/vm/gdbjit.cpp
@@ -17,6 +17,20 @@
__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()
{