blob: b9c73f3b00d0d623f1fde6e486d6353eac3357d7 [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,
Robert Widmannb02fe642018-04-23 13:51:43 +000029 LLVMDWARFSourceLanguageC, File, "llvm-c-test", 11, 0, NULL, 0, 0,
30 NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0);
31
32 LLVMMetadataRef Module =
33 LLVMDIBuilderCreateModule(DIB, CompileUnit,
34 "llvm-c-test", 11,
35 "", 0,
36 "/test/include/llvm-c-test.h", 27,
37 "", 0);
38
39 LLVMMetadataRef NameSpace =
40 LLVMDIBuilderCreateNameSpace(DIB, Module, "NameSpace", 9, false);
whitequark789164d2017-11-01 22:18:52 +000041
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000042 LLVMMetadataRef Int64Ty =
43 LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0);
44
45 LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty};
46 LLVMMetadataRef StructDbgTy =
Robert Widmannb02fe642018-04-23 13:51:43 +000047 LLVMDIBuilderCreateStructType(DIB, NameSpace, "MyStruct",
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000048 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3,
49 LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8);
50
51 LLVMMetadataRef StructDbgPtrTy =
52 LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0);
53
54 LLVMAddNamedMetadataOperand(M, "FooType",
55 LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
56
Robert Widmannf53050f2018-04-07 06:07:55 +000057
Robert Widmann6978db72018-04-23 14:29:33 +000058 LLVMTypeRef FooParamTys[] = {
59 LLVMInt64Type(),
60 LLVMInt64Type(),
61 LLVMVectorType(LLVMInt64Type(), 10),
62 };
63 LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0);
Robert Widmannf53050f2018-04-07 06:07:55 +000064 LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
Robert Widmann12e367b2018-04-22 19:24:44 +000065 LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
Robert Widmannf53050f2018-04-07 06:07:55 +000066
Robert Widmann6978db72018-04-23 14:29:33 +000067 LLVMMetadataRef Subscripts[] = {
68 LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10),
69 };
70 LLVMMetadataRef VectorTy =
71 LLVMDIBuilderCreateVectorType(DIB, 64 * 10, 0,
72 Int64Ty, Subscripts, 1);
73
74
75 LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
Robert Widmannf53050f2018-04-07 06:07:55 +000076 LLVMMetadataRef FunctionTy =
Robert Widmann6978db72018-04-23 14:29:33 +000077 LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
Robert Widmannf53050f2018-04-07 06:07:55 +000078 LLVMMetadataRef FunctionMetadata =
79 LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
80 File, 42, FunctionTy, true, true,
81 42, 0, false);
Robert Widmann6978db72018-04-23 14:29:33 +000082
Robert Widmann12e367b2018-04-22 19:24:44 +000083 LLVMMetadataRef FooParamLocation =
84 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
85 FunctionMetadata, NULL);
86 LLVMMetadataRef FooParamExpression =
87 LLVMDIBuilderCreateExpression(DIB, NULL, 0);
88 LLVMMetadataRef FooParamVar1 =
89 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
90 42, Int64Ty, true, 0);
91 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
92 FooParamVar1, FooParamExpression,
93 FooParamLocation, FooEntryBlock);
94 LLVMMetadataRef FooParamVar2 =
95 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
96 42, Int64Ty, true, 0);
97 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
98 FooParamVar2, FooParamExpression,
99 FooParamLocation, FooEntryBlock);
Robert Widmann6978db72018-04-23 14:29:33 +0000100 LLVMMetadataRef FooParamVar3 =
101 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "c", 1, 3, File,
102 42, VectorTy, true, 0);
103 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
104 FooParamVar3, FooParamExpression,
105 FooParamLocation, FooEntryBlock);
106
Robert Widmannf53050f2018-04-07 06:07:55 +0000107 LLVMSetSubprogram(FooFunction, FunctionMetadata);
108
109 LLVMMetadataRef FooLexicalBlock =
110 LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
111
112 LLVMValueRef InnerFooFunction =
113 LLVMAddFunction(M, "foo_inner_scope", FooFuncTy);
114 LLVMMetadataRef InnerFunctionMetadata =
115 LLVMDIBuilderCreateFunction(DIB, FooLexicalBlock, "foo_inner_scope", 15,
116 "foo_inner_scope", 15,
117 File, 42, FunctionTy, true, true,
118 42, 0, false);
119 LLVMSetSubprogram(InnerFooFunction, InnerFunctionMetadata);
120
121 LLVMDIBuilderFinalize(DIB);
122
whitequark789164d2017-11-01 22:18:52 +0000123 char *MStr = LLVMPrintModuleToString(M);
124 puts(MStr);
125 LLVMDisposeMessage(MStr);
126
127 LLVMDisposeDIBuilder(DIB);
128 LLVMDisposeModule(M);
129
130 return 0;
131}