diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt new file mode 100644 index 00000000000..d39640e4a59 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt @@ -0,0 +1,158 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.kotlin.backend.konan.llvm +/** + * This code was generated with following command: + * $ clang -xc -E -Idist/dependencies/clang-llvm-3.9.0-darwin-macos/include/ llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp -Wp,-P -Wp,-CC -o - | sed -e '/^$/d' -e '/^\ *\/\/.*$/d' > backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt + * + */ +internal enum class DwarfTag(val value:Int) { + DW_TAG_array_type(0x0001), + DW_TAG_class_type(0x0002), + DW_TAG_entry_point(0x0003), + DW_TAG_enumeration_type(0x0004), + DW_TAG_formal_parameter(0x0005), + DW_TAG_imported_declaration(0x0008), + DW_TAG_label(0x000a), + DW_TAG_lexical_block(0x000b), + DW_TAG_member(0x000d), + DW_TAG_pointer_type(0x000f), + DW_TAG_reference_type(0x0010), + DW_TAG_compile_unit(0x0011), + DW_TAG_string_type(0x0012), + DW_TAG_structure_type(0x0013), + DW_TAG_subroutine_type(0x0015), + DW_TAG_typedef(0x0016), + DW_TAG_union_type(0x0017), + DW_TAG_unspecified_parameters(0x0018), + DW_TAG_variant(0x0019), + DW_TAG_common_block(0x001a), + DW_TAG_common_inclusion(0x001b), + DW_TAG_inheritance(0x001c), + DW_TAG_inlined_subroutine(0x001d), + DW_TAG_module(0x001e), + DW_TAG_ptr_to_member_type(0x001f), + DW_TAG_set_type(0x0020), + DW_TAG_subrange_type(0x0021), + DW_TAG_with_stmt(0x0022), + DW_TAG_access_declaration(0x0023), + DW_TAG_base_type(0x0024), + DW_TAG_catch_block(0x0025), + DW_TAG_const_type(0x0026), + DW_TAG_constant(0x0027), + DW_TAG_enumerator(0x0028), + DW_TAG_file_type(0x0029), + DW_TAG_friend(0x002a), + DW_TAG_namelist(0x002b), + DW_TAG_namelist_item(0x002c), + DW_TAG_packed_type(0x002d), + DW_TAG_subprogram(0x002e), + DW_TAG_template_type_parameter(0x002f), + DW_TAG_template_value_parameter(0x0030), + DW_TAG_thrown_type(0x0031), + DW_TAG_try_block(0x0032), + DW_TAG_variant_part(0x0033), + DW_TAG_variable(0x0034), + DW_TAG_volatile_type(0x0035), + DW_TAG_dwarf_procedure(0x0036), + DW_TAG_restrict_type(0x0037), + DW_TAG_interface_type(0x0038), + DW_TAG_namespace(0x0039), + DW_TAG_imported_module(0x003a), + DW_TAG_unspecified_type(0x003b), + DW_TAG_partial_unit(0x003c), + DW_TAG_imported_unit(0x003d), + DW_TAG_condition(0x003f), + DW_TAG_shared_type(0x0040), + DW_TAG_type_unit(0x0041), + DW_TAG_rvalue_reference_type(0x0042), + DW_TAG_template_alias(0x0043), + DW_TAG_coarray_type(0x0044), + DW_TAG_generic_subrange(0x0045), + DW_TAG_dynamic_type(0x0046), + DW_TAG_MIPS_loop(0x4081), + DW_TAG_format_label(0x4101), + DW_TAG_function_template(0x4102), + DW_TAG_class_template(0x4103), + DW_TAG_GNU_template_template_param(0x4106), + DW_TAG_GNU_template_parameter_pack(0x4107), + DW_TAG_GNU_formal_parameter_pack(0x4108), + DW_TAG_APPLE_property(0x4200), + DW_TAG_BORLAND_property(0xb000), + DW_TAG_BORLAND_Delphi_string(0xb001), + DW_TAG_BORLAND_Delphi_dynamic_array(0xb002), + DW_TAG_BORLAND_Delphi_set(0xb003), + DW_TAG_BORLAND_Delphi_variant(0xb004), +} + internal enum class DwarfTypeKind(val value:Byte) { + DW_ATE_address(0x01), + DW_ATE_boolean(0x02), + DW_ATE_complex_float(0x03), + DW_ATE_float(0x04), + DW_ATE_signed(0x05), + DW_ATE_signed_char(0x06), + DW_ATE_unsigned(0x07), + DW_ATE_unsigned_char(0x08), + DW_ATE_imaginary_float(0x09), + DW_ATE_packed_decimal(0x0a), + DW_ATE_numeric_string(0x0b), + DW_ATE_edited(0x0c), + DW_ATE_signed_fixed(0x0d), + DW_ATE_unsigned_fixed(0x0e), + DW_ATE_decimal_float(0x0f), + DW_ATE_UTF(0x10), +} +internal enum class DwarfLanguage(val value:Int) { + DW_LANG_C89(0x0001), + DW_LANG_C(0x0002), + DW_LANG_Ada83(0x0003), + DW_LANG_C_plus_plus(0x0004), + DW_LANG_Cobol74(0x0005), + DW_LANG_Cobol85(0x0006), + DW_LANG_Fortran77(0x0007), + DW_LANG_Fortran90(0x0008), + DW_LANG_Pascal83(0x0009), + DW_LANG_Modula2(0x000a), + DW_LANG_Java(0x000b), + DW_LANG_C99(0x000c), + DW_LANG_Ada95(0x000d), + DW_LANG_Fortran95(0x000e), + DW_LANG_PLI(0x000f), + DW_LANG_ObjC(0x0010), + DW_LANG_ObjC_plus_plus(0x0011), + DW_LANG_UPC(0x0012), + DW_LANG_D(0x0013), + DW_LANG_Python(0x0014), + DW_LANG_OpenCL(0x0015), + DW_LANG_Go(0x0016), + DW_LANG_Modula3(0x0017), + DW_LANG_Haskell(0x0018), + DW_LANG_C_plus_plus_03(0x0019), + DW_LANG_C_plus_plus_11(0x001a), + DW_LANG_OCaml(0x001b), + DW_LANG_Rust(0x001c), + DW_LANG_C11(0x001d), + DW_LANG_Swift(0x001e), + DW_LANG_Julia(0x001f), + DW_LANG_Dylan(0x0020), + DW_LANG_C_plus_plus_14(0x0021), + DW_LANG_Fortran03(0x0022), + DW_LANG_Fortran08(0x0023), + DW_LANG_Mips_Assembler(0x8001), + DW_LANG_GOOGLE_RenderScript(0x8e57), + DW_LANG_BORLAND_Delphi(0xb000), + DW_LANG_Kotlin(0x0001) /* manually added, should be changed someday. */ +} diff --git a/llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp b/llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp new file mode 100644 index 00000000000..eeed87a5d01 --- /dev/null +++ b/llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.kotlin.backend.konan.llvm + +/** + * This code was generated with following command: + * $ clang -xc -E -Idist/dependencies/clang-llvm-3.9.0-darwin-macos/include/ llvmDebugInfoC/src/dwarf/include/dwarf_util.kt.pp -Wp,-P -Wp,-CC -o - | sed -e '/^$/d' -e '/^\ *\/\/.*$/d' > backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Dwarf.kt + * + */ + +internal enum class DwarfTag(val value:Int) { +#define HANDLE_DW_TAG(ID, NAME) DW_TAG_##NAME(ID), +#include "llvm/Support/Dwarf.def" +#undef HANDLE_DW_TAG +} + +internal enum class DwarfTypeKind(val value:Byte) { +#define HANDLE_DW_ATE(ID, NAME) DW_ATE_##NAME(ID), +#include "llvm/Support/Dwarf.def" +#undef HANDLE_DW_ATE +} + +internal enum class DwarfLanguage(val value:Int) { +#define HANDLE_DW_LANG(ID, NAME) DW_LANG_##NAME(ID), +#include "llvm/Support/Dwarf.def" +#undef HANDLE_DW_LANG + DW_LANG_Kotlin(0x0001) /* manually added, should be changed someday. */ +} \ No newline at end of file diff --git a/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp b/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp index 0d5633dbb29..57cdb998751 100644 --- a/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp +++ b/llvmDebugInfoC/src/main/cpp/DebugInfoC.cpp @@ -33,7 +33,9 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBuilder, DIBuilderRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DICompileUnit, DICompileUnitRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIFile, DIFileRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBasicType, DIBasicTypeRef) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DICompositeType, DICompositeTypeRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIType, DITypeOpaqueRef) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIDerivedType, DIDerivedTypeRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIModule, DIModuleRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIScope, DIScopeOpaqueRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DISubroutineType, DISubroutineTypeRef) @@ -95,7 +97,80 @@ DISubprogramRef DICreateFunction(DIBuilderRef builder, DIScopeOpaqueRef scope, scopeLine)); } -/* */ +DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder, + DIScopeOpaqueRef scope, const char *name, + DIFileRef file, unsigned lineNumber, + uint64_t sizeInBits, uint64_t alignInBits, + unsigned flags, DITypeOpaqueRef derivedFrom, + DIDerivedTypeRef *elements, + uint64_t elementsCount, + DICompositeTypeRef refPlace) { + auto builder = llvm::unwrap(refBuilder); + std::vector typeElements; + for(int i = 0; i != elementsCount; ++i) { + typeElements.push_back(llvm::unwrap(elements[i])); + } + auto elementsArray = builder->getOrCreateArray(typeElements); + auto composite = builder->createStructType(llvm::unwrap(scope), + name, llvm::unwrap(file), + lineNumber, + sizeInBits, alignInBits, flags, + llvm::unwrap(derivedFrom), + elementsArray); + builder->replaceTemporary(llvm::TempDIType(llvm::unwrap(refPlace)), composite); + return llvm::wrap(composite); +} + + +DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder, + uint64_t size, uint64_t alignInBits, + DITypeOpaqueRef refType, + uint64_t elementsCount) { + auto builder = llvm::unwrap(refBuilder); + auto range = std::vector({llvm::dyn_cast(builder->getOrCreateSubrange(0, size))}); + return llvm::wrap(builder->createArrayType(size, alignInBits, llvm::unwrap(refType), + builder->getOrCreateArray(range))); +} + + +DIDerivedTypeRef DICreateMemberType(DIBuilderRef refBuilder, + DIScopeOpaqueRef refScope, + const char *name, + DIFileRef file, + unsigned lineNum, + uint64_t sizeInBits, + uint64_t alignInBits, + uint64_t offsetInBits, + unsigned flags, + DITypeOpaqueRef type) { + return llvm::wrap(llvm::unwrap(refBuilder)->createMemberType( + llvm::unwrap(refScope), + name, + llvm::unwrap(file), + lineNum, + sizeInBits, + alignInBits, + offsetInBits, + flags, + llvm::unwrap(type))); +} + +DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder, + int tag, + const char *name, + DIScopeOpaqueRef refScope, + DIFileRef refFile, + unsigned line) { + return llvm::wrap(llvm::unwrap(refBuilder)->createReplaceableCompositeType( + tag, name, llvm::unwrap(refScope), llvm::unwrap(refFile), line)); +} + +DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType) { + return llvm::wrap(llvm::unwrap(refBuilder)->createReferenceType( + llvm::dwarf::DW_TAG_reference_type, + llvm::unwrap(refType))); +} + DISubroutineTypeRef DICreateSubroutineType(DIBuilderRef builder, DITypeOpaqueRef* types, unsigned typesCount) { diff --git a/llvmDebugInfoC/src/main/include/DebugInfoC.h b/llvmDebugInfoC/src/main/include/DebugInfoC.h index 49f6b577208..c5e6f850335 100644 --- a/llvmDebugInfoC/src/main/include/DebugInfoC.h +++ b/llvmDebugInfoC/src/main/include/DebugInfoC.h @@ -24,6 +24,8 @@ typedef struct DIBuilder *DIBuilderRef; typedef struct DICompileUnit *DICompileUnitRef; typedef struct DIFile *DIFileRef; typedef struct DIBasicType *DIBasicTypeRef; +typedef struct DICompositeType *DICompositeTypeRef; +typedef struct DIDerivedType *DIDerivedTypeRef; typedef struct DIType *DITypeOpaqueRef; typedef struct DISubprogram *DISubprogramRef; typedef struct DIModule *DIModuleRef; @@ -43,6 +45,38 @@ DIFileRef DICreateFile(DIBuilderRef builder, const char *filename, const char *d DIBasicTypeRef DICreateBasicType(DIBuilderRef builder, const char* name, uint64_t sizeInBits, uint64_t alignment, unsigned encoding); +DICompositeTypeRef DICreateStructType(DIBuilderRef refBuilder, + DIScopeOpaqueRef scope, const char *name, + DIFileRef file, unsigned lineNumber, + uint64_t sizeInBits, uint64_t alignInBits, + unsigned flags, DITypeOpaqueRef derivedFrom, + DIDerivedTypeRef *elements, + uint64_t elementsCount, + DICompositeTypeRef refPlace); +DICompositeTypeRef DICreateArrayType(DIBuilderRef refBuilder, + uint64_t size, uint64_t alignInBits, + DITypeOpaqueRef type, + uint64_t elementsCount); + +DIDerivedTypeRef DICreateReferenceType(DIBuilderRef refBuilder, DITypeOpaqueRef refType); +DICompositeTypeRef DICreateReplaceableCompositeType(DIBuilderRef refBuilder, + int tag, + const char *name, + DIScopeOpaqueRef refScope, + DIFileRef refFile, + unsigned line); +DIDerivedTypeRef DICreateMemberType(DIBuilderRef refBuilder, + DIScopeOpaqueRef refScope, + const char *name, + DIFileRef file, + unsigned lineNum, + uint64_t sizeInBits, + uint64_t alignInBits, + uint64_t offsetInBits, + unsigned flags, + DITypeOpaqueRef type); + + DIModuleRef DICreateModule(DIBuilderRef builder, DIScopeOpaqueRef scope, const char* name, const char* configurationMacro, const char* includePath, const char *iSysRoot);