blob: 26a477e432fb589bdc14b4b476b3fbc270a8ffa1 [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
Robert Widmannaec494f32018-04-28 22:32:07 +000039 LLVMMetadataRef OtherModule =
40 LLVMDIBuilderCreateModule(DIB, CompileUnit,
41 "llvm-c-test-import", 18,
42 "", 0,
43 "/test/include/llvm-c-test-import.h", 34,
44 "", 0);
45 LLVMMetadataRef ImportedModule =
46 LLVMDIBuilderCreateImportedModuleFromModule(DIB, Module, OtherModule,
47 File, 42);
whitequarkb18cd6d2018-04-29 02:01:34 +000048 LLVMDIBuilderCreateImportedModuleFromAlias(DIB, Module, ImportedModule,
49 File, 42);
Robert Widmannaec494f32018-04-28 22:32:07 +000050
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000051 LLVMMetadataRef Int64Ty =
52 LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0);
Robert Widmann4b0084b2018-05-10 21:10:06 +000053 LLVMMetadataRef Int64TypeDef =
54 LLVMDIBuilderCreateTypedef(DIB, Int64Ty, "int64_t", 7, File, 42, File);
55
Robert Widmann21fc15d2018-04-23 22:31:49 +000056 LLVMMetadataRef GlobalVarValueExpr =
57 LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
58 LLVMDIBuilderCreateGlobalVariableExpression(DIB, Module, "global", 6,
Robert Widmann4b0084b2018-05-10 21:10:06 +000059 "", 0, File, 1, Int64TypeDef,
Robert Widmann21fc15d2018-04-23 22:31:49 +000060 true, GlobalVarValueExpr,
61 NULL, 0);
62
63 LLVMMetadataRef NameSpace =
64 LLVMDIBuilderCreateNameSpace(DIB, Module, "NameSpace", 9, false);
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000065
66 LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty};
67 LLVMMetadataRef StructDbgTy =
Robert Widmannb02fe642018-04-23 13:51:43 +000068 LLVMDIBuilderCreateStructType(DIB, NameSpace, "MyStruct",
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000069 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3,
70 LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8);
71
72 LLVMMetadataRef StructDbgPtrTy =
73 LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0);
74
75 LLVMAddNamedMetadataOperand(M, "FooType",
76 LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
77
Robert Widmannf53050f2018-04-07 06:07:55 +000078
Robert Widmann6978db72018-04-23 14:29:33 +000079 LLVMTypeRef FooParamTys[] = {
80 LLVMInt64Type(),
81 LLVMInt64Type(),
82 LLVMVectorType(LLVMInt64Type(), 10),
83 };
84 LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0);
Robert Widmannf53050f2018-04-07 06:07:55 +000085 LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
Robert Widmann12e367b2018-04-22 19:24:44 +000086 LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
Robert Widmannf53050f2018-04-07 06:07:55 +000087
Robert Widmann6978db72018-04-23 14:29:33 +000088 LLVMMetadataRef Subscripts[] = {
89 LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10),
90 };
91 LLVMMetadataRef VectorTy =
92 LLVMDIBuilderCreateVectorType(DIB, 64 * 10, 0,
93 Int64Ty, Subscripts, 1);
94
95
96 LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
Robert Widmannf53050f2018-04-07 06:07:55 +000097 LLVMMetadataRef FunctionTy =
Robert Widmann6978db72018-04-23 14:29:33 +000098 LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
Robert Widmanna428eba2018-05-10 18:09:53 +000099
100 LLVMMetadataRef ReplaceableFunctionMetadata =
101 LLVMDIBuilderCreateReplaceableCompositeType(DIB, 0x15, "foo", 3,
102 File, File, 42,
103 0, 0, 0,
104 LLVMDIFlagFwdDecl,
105 "", 0);
106
107 LLVMMetadataRef FooParamLocation =
108 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
109 ReplaceableFunctionMetadata, NULL);
Robert Widmannf53050f2018-04-07 06:07:55 +0000110 LLVMMetadataRef FunctionMetadata =
111 LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
112 File, 42, FunctionTy, true, true,
113 42, 0, false);
Robert Widmanna428eba2018-05-10 18:09:53 +0000114 LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata);
Robert Widmann6978db72018-04-23 14:29:33 +0000115
Robert Widmann12e367b2018-04-22 19:24:44 +0000116 LLVMMetadataRef FooParamExpression =
117 LLVMDIBuilderCreateExpression(DIB, NULL, 0);
118 LLVMMetadataRef FooParamVar1 =
119 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
120 42, Int64Ty, true, 0);
121 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
122 FooParamVar1, FooParamExpression,
123 FooParamLocation, FooEntryBlock);
124 LLVMMetadataRef FooParamVar2 =
125 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
126 42, Int64Ty, true, 0);
127 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
128 FooParamVar2, FooParamExpression,
129 FooParamLocation, FooEntryBlock);
Robert Widmann6978db72018-04-23 14:29:33 +0000130 LLVMMetadataRef FooParamVar3 =
131 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "c", 1, 3, File,
132 42, VectorTy, true, 0);
133 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
134 FooParamVar3, FooParamExpression,
135 FooParamLocation, FooEntryBlock);
136
Robert Widmannf53050f2018-04-07 06:07:55 +0000137 LLVMSetSubprogram(FooFunction, FunctionMetadata);
138
139 LLVMMetadataRef FooLexicalBlock =
140 LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
141
Robert Widmann21fc15d2018-04-23 22:31:49 +0000142 LLVMBasicBlockRef FooVarBlock = LLVMAppendBasicBlock(FooFunction, "vars");
143 LLVMMetadataRef FooVarsLocation =
144 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 43, 0,
145 FunctionMetadata, NULL);
146 LLVMMetadataRef FooVar1 =
147 LLVMDIBuilderCreateAutoVariable(DIB, FooLexicalBlock, "d", 1, File,
148 43, Int64Ty, true, 0, 0);
149 LLVMValueRef FooVal1 = LLVMConstInt(LLVMInt64Type(), 0, false);
150 LLVMMetadataRef FooVarValueExpr =
151 LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
152
153 LLVMDIBuilderInsertDbgValueAtEnd(DIB, FooVal1, FooVar1, FooVarValueExpr,
154 FooVarsLocation, FooVarBlock);
Robert Widmannf53050f2018-04-07 06:07:55 +0000155
156 LLVMDIBuilderFinalize(DIB);
157
whitequark789164d2017-11-01 22:18:52 +0000158 char *MStr = LLVMPrintModuleToString(M);
159 puts(MStr);
160 LLVMDisposeMessage(MStr);
161
162 LLVMDisposeDIBuilder(DIB);
163 LLVMDisposeModule(M);
164
165 return 0;
166}