blob: 0c3410d949e45e7a87bf01c29b7f36aecb217467 [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);
48 LLVMMetadataRef AliasImportedModule =
49 LLVMDIBuilderCreateImportedModuleFromAlias(DIB, Module, ImportedModule,
50 File, 42);
51
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000052 LLVMMetadataRef Int64Ty =
53 LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0);
Robert Widmann21fc15d2018-04-23 22:31:49 +000054 LLVMMetadataRef GlobalVarValueExpr =
55 LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
56 LLVMDIBuilderCreateGlobalVariableExpression(DIB, Module, "global", 6,
57 "", 0, File, 1, Int64Ty,
58 true, GlobalVarValueExpr,
59 NULL, 0);
60
61 LLVMMetadataRef NameSpace =
62 LLVMDIBuilderCreateNameSpace(DIB, Module, "NameSpace", 9, false);
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000063
64 LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty};
65 LLVMMetadataRef StructDbgTy =
Robert Widmannb02fe642018-04-23 13:51:43 +000066 LLVMDIBuilderCreateStructType(DIB, NameSpace, "MyStruct",
Harlan Haskinsb7881bb2018-04-02 00:17:40 +000067 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3,
68 LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8);
69
70 LLVMMetadataRef StructDbgPtrTy =
71 LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0);
72
73 LLVMAddNamedMetadataOperand(M, "FooType",
74 LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
75
Robert Widmannf53050f2018-04-07 06:07:55 +000076
Robert Widmann6978db72018-04-23 14:29:33 +000077 LLVMTypeRef FooParamTys[] = {
78 LLVMInt64Type(),
79 LLVMInt64Type(),
80 LLVMVectorType(LLVMInt64Type(), 10),
81 };
82 LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0);
Robert Widmannf53050f2018-04-07 06:07:55 +000083 LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
Robert Widmann12e367b2018-04-22 19:24:44 +000084 LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
Robert Widmannf53050f2018-04-07 06:07:55 +000085
Robert Widmann6978db72018-04-23 14:29:33 +000086 LLVMMetadataRef Subscripts[] = {
87 LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10),
88 };
89 LLVMMetadataRef VectorTy =
90 LLVMDIBuilderCreateVectorType(DIB, 64 * 10, 0,
91 Int64Ty, Subscripts, 1);
92
93
94 LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
Robert Widmannf53050f2018-04-07 06:07:55 +000095 LLVMMetadataRef FunctionTy =
Robert Widmann6978db72018-04-23 14:29:33 +000096 LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
Robert Widmannf53050f2018-04-07 06:07:55 +000097 LLVMMetadataRef FunctionMetadata =
98 LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
99 File, 42, FunctionTy, true, true,
100 42, 0, false);
Robert Widmann6978db72018-04-23 14:29:33 +0000101
Robert Widmann12e367b2018-04-22 19:24:44 +0000102 LLVMMetadataRef FooParamLocation =
103 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
104 FunctionMetadata, NULL);
105 LLVMMetadataRef FooParamExpression =
106 LLVMDIBuilderCreateExpression(DIB, NULL, 0);
107 LLVMMetadataRef FooParamVar1 =
108 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
109 42, Int64Ty, true, 0);
110 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
111 FooParamVar1, FooParamExpression,
112 FooParamLocation, FooEntryBlock);
113 LLVMMetadataRef FooParamVar2 =
114 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
115 42, Int64Ty, true, 0);
116 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
117 FooParamVar2, FooParamExpression,
118 FooParamLocation, FooEntryBlock);
Robert Widmann6978db72018-04-23 14:29:33 +0000119 LLVMMetadataRef FooParamVar3 =
120 LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "c", 1, 3, File,
121 42, VectorTy, true, 0);
122 LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false),
123 FooParamVar3, FooParamExpression,
124 FooParamLocation, FooEntryBlock);
125
Robert Widmannf53050f2018-04-07 06:07:55 +0000126 LLVMSetSubprogram(FooFunction, FunctionMetadata);
127
128 LLVMMetadataRef FooLexicalBlock =
129 LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
130
Robert Widmann21fc15d2018-04-23 22:31:49 +0000131 LLVMBasicBlockRef FooVarBlock = LLVMAppendBasicBlock(FooFunction, "vars");
132 LLVMMetadataRef FooVarsLocation =
133 LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 43, 0,
134 FunctionMetadata, NULL);
135 LLVMMetadataRef FooVar1 =
136 LLVMDIBuilderCreateAutoVariable(DIB, FooLexicalBlock, "d", 1, File,
137 43, Int64Ty, true, 0, 0);
138 LLVMValueRef FooVal1 = LLVMConstInt(LLVMInt64Type(), 0, false);
139 LLVMMetadataRef FooVarValueExpr =
140 LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
141
142 LLVMDIBuilderInsertDbgValueAtEnd(DIB, FooVal1, FooVar1, FooVarValueExpr,
143 FooVarsLocation, FooVarBlock);
Robert Widmannf53050f2018-04-07 06:07:55 +0000144
145 LLVMDIBuilderFinalize(DIB);
146
whitequark789164d2017-11-01 22:18:52 +0000147 char *MStr = LLVMPrintModuleToString(M);
148 puts(MStr);
149 LLVMDisposeMessage(MStr);
150
151 LLVMDisposeDIBuilder(DIB);
152 LLVMDisposeModule(M);
153
154 return 0;
155}