Merge pull request #2720 from mono/fix-39325
[mono.git] / mono / mini / mini-llvm-cpp.cpp
index 6fab934f479b6d7503dffc9e043e367814bc9db2..e3219686ae2cf5beb7eb8ea5adb7fc9987e51d86 100644 (file)
@@ -3,6 +3,7 @@
 //
 // (C) 2009-2011 Novell, Inc.
 // Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 //
 
 //
@@ -218,10 +219,61 @@ mono_llvm_set_call_preserveall_cc (LLVMValueRef func)
        unwrap<CallInst>(func)->setCallingConv (CallingConv::PreserveAll);
 }
 
+#if LLVM_API_VERSION > 100
+
+void*
+mono_llvm_create_di_builder (LLVMModuleRef module)
+{
+       return new DIBuilder (*unwrap(module));
+}
+
+void*
+mono_llvm_di_create_compile_unit (void *di_builder, const char *cu_name, const char *dir, const char *producer)
+{
+       DIBuilder *builder = (DIBuilder*)di_builder;
+
+       return builder->createCompileUnit (dwarf::DW_LANG_C99, cu_name, dir, producer, true, "", 0);
+}
+
+void*
+mono_llvm_di_create_function (void *di_builder, void *cu, const char *name, const char *mangled_name, const char *dir, const char *file, int line)
+{
+       DIBuilder *builder = (DIBuilder*)di_builder;
+       DIFile *di_file;
+       DISubroutineType *type;
+
+       // FIXME: Share DIFile
+       di_file = builder->createFile (file, dir);
+       type = builder->createSubroutineType (builder->getOrCreateTypeArray (ArrayRef<Metadata*> ()));
+       return builder->createFunction (di_file, name, mangled_name, di_file, line, type, true, true, 0);
+}
+
+void*
+mono_llvm_di_create_file (void *di_builder, const char *dir, const char *file)
+{
+       DIBuilder *builder = (DIBuilder*)di_builder;
+
+       return builder->createFile (file, dir);
+}
+
+void*
+mono_llvm_di_create_location (void *di_builder, void *scope, int row, int column)
+{
+       return DILocation::get (*unwrap(LLVMGetGlobalContext ()), row, column, (Metadata*)scope);
+}
+
 void
-mono_llvm_create_di_compile_unit (LLVMModuleRef module)
+mono_llvm_di_set_location (LLVMBuilderRef builder, void *loc_md)
 {
-       DIBuilder d(*unwrap(module));
+       unwrap(builder)->SetCurrentDebugLocation ((DILocation*)loc_md);
+}
 
-       d.createCompileUnit (0, "X", "Y", "Z", false, "", 0, "", DIBuilder::DebugEmissionKind::FullDebug, true);
+void
+mono_llvm_di_builder_finalize (void *di_builder)
+{
+       DIBuilder *builder = (DIBuilder*)di_builder;
+
+       builder->finalize ();
 }
+
+#endif /* #if LLVM_API_VERSION > 100 */