Home | History | Annotate | Line # | Download | only in llvm-c-test
      1 /*===-- debuginfo.c - tool for testing libLLVM and llvm-c API -------------===*\
      2 |*                                                                            *|
      3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
      4 |* Exceptions.                                                                *|
      5 |* See https://llvm.org/LICENSE.txt for license information.                  *|
      6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
      7 |*                                                                            *|
      8 |*===----------------------------------------------------------------------===*|
      9 |*                                                                            *|
     10 |* Tests for the LLVM C DebugInfo API                                         *|
     11 |*                                                                            *|
     12 \*===----------------------------------------------------------------------===*/
     13 
     14 #include "llvm-c-test.h"
     15 #include "llvm-c/Core.h"
     16 #include "llvm-c/DebugInfo.h"
     17 #include <stdio.h>
     18 #include <string.h>
     19 
     20 static LLVMMetadataRef
     21 declare_objc_class(LLVMDIBuilderRef DIB, LLVMMetadataRef File) {
     22   LLVMMetadataRef Decl = LLVMDIBuilderCreateStructType(DIB, File, "TestClass", 9, File, 42, 64, 0, LLVMDIFlagObjcClassComplete, NULL, NULL, 0, 0, NULL, NULL, 0);
     23   LLVMMetadataRef SuperDecl = LLVMDIBuilderCreateStructType(DIB, File, "TestSuperClass", 14, File, 42, 64, 0, LLVMDIFlagObjcClassComplete, NULL, NULL, 0, 0, NULL, NULL, 0);
     24   LLVMDIBuilderCreateInheritance(DIB, Decl, SuperDecl, 0, 0, 0);
     25   LLVMMetadataRef TestProperty =
     26       LLVMDIBuilderCreateObjCProperty(DIB, "test", 4, File, 42, "getTest", 7, "setTest", 7, 0x20 /*copy*/ | 0x40 /*nonatomic*/, SuperDecl);
     27   LLVMDIBuilderCreateObjCIVar(DIB, "_test", 5, File, 42, 64, 0, 64, LLVMDIFlagPublic, SuperDecl, TestProperty);
     28   return Decl;
     29 }
     30 
     31 int llvm_test_dibuilder(void) {
     32   const char *Filename = "debuginfo.c";
     33   LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
     34   LLVMDIBuilderRef DIB = LLVMCreateDIBuilder(M);
     35 
     36   LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, Filename,
     37     strlen(Filename), ".", 1);
     38 
     39   LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit(
     40       DIB, LLVMDWARFSourceLanguageC, File, "llvm-c-test", 11, 0, NULL, 0, 0,
     41       NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0, "/", 1, "", 0);
     42 
     43   LLVMMetadataRef Module =
     44     LLVMDIBuilderCreateModule(DIB, CompileUnit,
     45                               "llvm-c-test", 11,
     46                               "", 0,
     47                               "/test/include/llvm-c-test.h", 27,
     48                               "", 0);
     49 
     50   LLVMMetadataRef OtherModule =
     51     LLVMDIBuilderCreateModule(DIB, CompileUnit,
     52                               "llvm-c-test-import", 18,
     53                               "", 0,
     54                               "/test/include/llvm-c-test-import.h", 34,
     55                               "", 0);
     56   LLVMMetadataRef ImportedModule =
     57     LLVMDIBuilderCreateImportedModuleFromModule(DIB, Module, OtherModule,
     58                                                 File, 42);
     59   LLVMDIBuilderCreateImportedModuleFromAlias(DIB, Module, ImportedModule,
     60                                              File, 42);
     61 
     62   LLVMMetadataRef ClassTy = declare_objc_class(DIB, File);
     63   LLVMMetadataRef GlobalClassValueExpr =
     64       LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
     65   LLVMDIBuilderCreateGlobalVariableExpression(
     66       DIB, Module, "globalClass", 11, "", 0, File, 1, ClassTy, true,
     67       GlobalClassValueExpr, NULL, 0);
     68 
     69   LLVMMetadataRef Int64Ty =
     70       LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0, LLVMDIFlagZero);
     71   LLVMMetadataRef Int64TypeDef =
     72       LLVMDIBuilderCreateTypedef(DIB, Int64Ty, "int64_t", 7, File, 42, File, 0);
     73 
     74   LLVMMetadataRef GlobalVarValueExpr =
     75       LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
     76   LLVMDIBuilderCreateGlobalVariableExpression(
     77       DIB, Module, "global", 6, "", 0, File, 1, Int64TypeDef, true,
     78       GlobalVarValueExpr, NULL, 0);
     79 
     80   LLVMMetadataRef NameSpace =
     81       LLVMDIBuilderCreateNameSpace(DIB, Module, "NameSpace", 9, false);
     82 
     83   LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty};
     84   LLVMMetadataRef StructDbgTy =
     85     LLVMDIBuilderCreateStructType(DIB, NameSpace, "MyStruct",
     86     8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3,
     87     LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8);
     88 
     89   LLVMMetadataRef StructDbgPtrTy =
     90     LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0);
     91 
     92   LLVMAddNamedMetadataOperand(M, "FooType",
     93     LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
     94 
     95 
     96   LLVMTypeRef FooParamTys[] = {
     97     LLVMInt64Type(),
     98     LLVMInt64Type(),
     99     LLVMVectorType(LLVMInt64Type(), 10),
    100   };
    101   LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0);
    102   LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
    103   LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
    104 
    105   LLVMMetadataRef Subscripts[] = {
    106     LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10),
    107   };
    108   LLVMMetadataRef VectorTy =
    109     LLVMDIBuilderCreateVectorType(DIB, 64 * 10, 0,
    110                                   Int64Ty, Subscripts, 1);
    111 
    112 
    113   LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
    114   LLVMMetadataRef FunctionTy =
    115     LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
    116 
    117   LLVMMetadataRef ReplaceableFunctionMetadata =
    118     LLVMDIBuilderCreateReplaceableCompositeType(DIB, 0x15, "foo", 3,
    119                                                 File, File, 42,
    120                                                 0, 0, 0,
    121                                                 LLVMDIFlagFwdDecl,
    122                                                 "", 0);
    123 
    124   LLVMMetadataRef FooParamLocation =
    125     LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
    126                                      ReplaceableFunctionMetadata, NULL);
    127   LLVMMetadataRef FunctionMetadata =
    128     LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
    129                                 File, 42, FunctionTy, true, true,
    130                                 42, 0, false);
    131   LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata);
    132 
    133   LLVMMetadataRef FooParamExpression =
    134     LLVMDIBuilderCreateExpression(DIB, NULL, 0);
    135   LLVMMetadataRef FooParamVar1 =
    136     LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
    137                                          42, Int64Ty, true, 0);
    138   LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
    139                                   FooParamVar1, FooParamExpression,
    140                                   FooParamLocation, FooEntryBlock);
    141   LLVMMetadataRef FooParamVar2 =
    142     LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
    143                                          42, Int64Ty, true, 0);
    144   LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
    145                                   FooParamVar2, FooParamExpression,
    146                                   FooParamLocation, FooEntryBlock);
    147   LLVMMetadataRef FooParamVar3 =
    148     LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "c", 1, 3, File,
    149                                          42, VectorTy, true, 0);
    150   LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
    151                                   FooParamVar3, FooParamExpression,
    152                                   FooParamLocation, FooEntryBlock);
    153 
    154   LLVMSetSubprogram(FooFunction, FunctionMetadata);
    155 
    156   LLVMMetadataRef FooLexicalBlock =
    157     LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
    158 
    159   LLVMBasicBlockRef FooVarBlock = LLVMAppendBasicBlock(FooFunction, "vars");
    160   LLVMMetadataRef FooVarsLocation =
    161     LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 43, 0,
    162                                      FunctionMetadata, NULL);
    163   LLVMMetadataRef FooVar1 =
    164     LLVMDIBuilderCreateAutoVariable(DIB, FooLexicalBlock, "d", 1, File,
    165                                     43, Int64Ty, true, 0, 0);
    166   LLVMValueRef FooVal1 = LLVMConstInt(LLVMInt64Type(), 0, false);
    167   LLVMMetadataRef FooVarValueExpr =
    168     LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
    169 
    170   LLVMDIBuilderInsertDbgValueAtEnd(DIB, FooVal1, FooVar1, FooVarValueExpr,
    171                                    FooVarsLocation, FooVarBlock);
    172 
    173   LLVMMetadataRef MacroFile =
    174       LLVMDIBuilderCreateTempMacroFile(DIB, NULL, 0, File);
    175   LLVMDIBuilderCreateMacro(DIB, MacroFile, 0, LLVMDWARFMacinfoRecordTypeDefine,
    176                            "SIMPLE_DEFINE", 13, NULL, 0);
    177   LLVMDIBuilderCreateMacro(DIB, MacroFile, 0, LLVMDWARFMacinfoRecordTypeDefine,
    178                            "VALUE_DEFINE", 12, "1", 1);
    179 
    180   LLVMMetadataRef EnumeratorTestA =
    181       LLVMDIBuilderCreateEnumerator(DIB, "Test_A", strlen("Test_A"), 0, true);
    182   LLVMMetadataRef EnumeratorTestB =
    183       LLVMDIBuilderCreateEnumerator(DIB, "Test_B", strlen("Test_B"), 1, true);
    184   LLVMMetadataRef EnumeratorTestC =
    185       LLVMDIBuilderCreateEnumerator(DIB, "Test_B", strlen("Test_C"), 2, true);
    186   LLVMMetadataRef EnumeratorsTest[] = {EnumeratorTestA, EnumeratorTestB,
    187                                        EnumeratorTestC};
    188   LLVMMetadataRef EnumTest = LLVMDIBuilderCreateEnumerationType(
    189       DIB, NameSpace, "EnumTest", strlen("EnumTest"), File, 0, 64, 0,
    190       EnumeratorsTest, 3, Int64Ty);
    191   LLVMAddNamedMetadataOperand(
    192       M, "EnumTest", LLVMMetadataAsValue(LLVMGetModuleContext(M), EnumTest));
    193 
    194   LLVMDIBuilderFinalize(DIB);
    195 
    196   char *MStr = LLVMPrintModuleToString(M);
    197   puts(MStr);
    198   LLVMDisposeMessage(MStr);
    199 
    200   LLVMDisposeDIBuilder(DIB);
    201   LLVMDisposeModule(M);
    202 
    203   return 0;
    204 }
    205