blob: b1cc85197851f261a29b872b8eef2fb5f3f59860 [file] [log] [blame]
whitequark789164d2017-11-01 22:18:52 +00001/*===-- debuginfo.c - tool for testing libLLVM and llvm-c API -------------===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
5|* This file is distributed under the University of Illinois Open Source *|
6|* License. See LICENSE.TXT for details. *|
7|* *|
8|*===----------------------------------------------------------------------===*|
9|* *|
10|* Tests for the LLVM C DebugInfo API *|
11|* *|
12\*===----------------------------------------------------------------------===*/
13
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000014#include "llvm-c-test.h"
15#include "llvm-c/Core.h"
whitequark789164d2017-11-01 22:18:52 +000016#include "llvm-c/DebugInfo.h"
whitequark789164d2017-11-01 22:18:52 +000017#include <stdio.h>
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000018#include <string.h>
whitequark789164d2017-11-01 22:18:52 +000019
Galina Kistanova5f8c84c2017-12-16 02:54:17 +000020int llvm_test_dibuilder(void) {
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000021 const char *Filename = "debuginfo.c";
22 LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
whitequark789164d2017-11-01 22:18:52 +000023 LLVMDIBuilderRef DIB = LLVMCreateDIBuilder(M);
24
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000025 LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, Filename,
26 strlen(Filename), ".", 1);
whitequark789164d2017-11-01 22:18:52 +000027
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000028 LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit(DIB,
whitequark789164d2017-11-01 22:18:52 +000029 LLVMDWARFSourceLanguageC, File,"llvm-c-test", 11, 0, NULL, 0, 0,
30 NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0);
31
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000032 LLVMMetadataRef Int64Ty =
33 LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0);
34
35 LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty};
36 LLVMMetadataRef StructDbgTy =
37 LLVMDIBuilderCreateStructType(DIB, CompileUnit, "MyStruct",
38 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3,
39 LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8);
40
41 LLVMMetadataRef StructDbgPtrTy =
42 LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0);
43
44 LLVMAddNamedMetadataOperand(M, "FooType",
45 LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
46
Robert Widmannf53050f2018-04-07 06:07:55 +000047
48 LLVMTypeRef FooParamTys[] = { LLVMInt64Type(), LLVMInt64Type() };
49 LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 2, 0);
50 LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
Robert Widmann12e367b2018-04-22 19:24:44 +000051 LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
Robert Widmannf53050f2018-04-07 06:07:55 +000052
53 LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty};
54 LLVMMetadataRef FunctionTy =
55 LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 2, 0);
56 LLVMMetadataRef FunctionMetadata =
57 LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
58 File, 42, FunctionTy, true, true,
59 42, 0, false);
Robert Widmann12e367b2018-04-22 19:24:44 +000060 LLVMMetadataRef FooParamLocation =
61 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
62 FunctionMetadata, NULL);
63 LLVMMetadataRef FooParamExpression =
64 LLVMDIBuilderCreateExpression(DIB, NULL, 0);
65 LLVMMetadataRef FooParamVar1 =
66 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
67 42, Int64Ty, true, 0);
68 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
69 FooParamVar1, FooParamExpression,
70 FooParamLocation, FooEntryBlock);
71 LLVMMetadataRef FooParamVar2 =
72 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
73 42, Int64Ty, true, 0);
74 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
75 FooParamVar2, FooParamExpression,
76 FooParamLocation, FooEntryBlock);
Robert Widmannf53050f2018-04-07 06:07:55 +000077 LLVMSetSubprogram(FooFunction, FunctionMetadata);
78
79 LLVMMetadataRef FooLexicalBlock =
80 LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
81
82 LLVMValueRef InnerFooFunction =
83 LLVMAddFunction(M, "foo_inner_scope", FooFuncTy);
84 LLVMMetadataRef InnerFunctionMetadata =
85 LLVMDIBuilderCreateFunction(DIB, FooLexicalBlock, "foo_inner_scope", 15,
86 "foo_inner_scope", 15,
87 File, 42, FunctionTy, true, true,
88 42, 0, false);
89 LLVMSetSubprogram(InnerFooFunction, InnerFunctionMetadata);
90
91 LLVMDIBuilderFinalize(DIB);
92
whitequark789164d2017-11-01 22:18:52 +000093 char *MStr = LLVMPrintModuleToString(M);
94 puts(MStr);
95 LLVMDisposeMessage(MStr);
96
97 LLVMDisposeDIBuilder(DIB);
98 LLVMDisposeModule(M);
99
100 return 0;
101}