|
14 | 14 | #include "llvm/IR/GlobalAlias.h"
|
15 | 15 | #include "llvm/IR/GlobalVariable.h"
|
16 | 16 | #include "llvm/IR/Instructions.h"
|
| 17 | +#include "llvm/IR/IRBuilder.h" |
17 | 18 | #include "llvm/IR/LLVMContext.h"
|
18 | 19 | #include "llvm/IR/LegacyPassManager.h"
|
19 | 20 | #include "llvm/IR/Module.h"
|
@@ -146,26 +147,58 @@ TEST(VerifierTest, CrossModuleMetadataRef) {
|
146 | 147 | }
|
147 | 148 |
|
148 | 149 | TEST(VerifierTest, StripInvalidDebugInfo) {
|
149 |
| - LLVMContext C; |
150 |
| - Module M("M", C); |
151 |
| - DIBuilder DIB(M); |
152 |
| - DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/", |
153 |
| - "unittest", false, "", 0); |
154 |
| - DIB.finalize(); |
155 |
| - EXPECT_FALSE(verifyModule(M)); |
156 |
| - |
157 |
| - // Now break it. |
158 |
| - auto *File = DIB.createFile("not-a-CU.f", "."); |
159 |
| - NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); |
160 |
| - NMD->addOperand(File); |
161 |
| - EXPECT_TRUE(verifyModule(M)); |
162 |
| - |
163 |
| - ModulePassManager MPM(true); |
164 |
| - MPM.addPass(VerifierPass(false)); |
165 |
| - ModuleAnalysisManager MAM(true); |
166 |
| - MAM.registerPass(VerifierAnalysis()); |
167 |
| - MPM.run(M, &MAM); |
168 |
| - EXPECT_FALSE(verifyModule(M)); |
| 150 | + { |
| 151 | + LLVMContext C; |
| 152 | + Module M("M", C); |
| 153 | + DIBuilder DIB(M); |
| 154 | + DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/", "unittest", |
| 155 | + false, "", 0); |
| 156 | + DIB.finalize(); |
| 157 | + EXPECT_FALSE(verifyModule(M)); |
| 158 | + |
| 159 | + // Now break it by inserting non-CU node to the list of CUs. |
| 160 | + auto *File = DIB.createFile("not-a-CU.f", "."); |
| 161 | + NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); |
| 162 | + NMD->addOperand(File); |
| 163 | + EXPECT_TRUE(verifyModule(M)); |
| 164 | + |
| 165 | + ModulePassManager MPM(true); |
| 166 | + MPM.addPass(VerifierPass(false)); |
| 167 | + ModuleAnalysisManager MAM(true); |
| 168 | + MAM.registerPass(VerifierAnalysis()); |
| 169 | + MPM.run(M, &MAM); |
| 170 | + EXPECT_FALSE(verifyModule(M)); |
| 171 | + } |
| 172 | + { |
| 173 | + LLVMContext C; |
| 174 | + Module M("M", C); |
| 175 | + DIBuilder DIB(M); |
| 176 | + auto *CU = DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/", |
| 177 | + "unittest", false, "", 0); |
| 178 | + new GlobalVariable(M, Type::getInt8Ty(C), false, |
| 179 | + GlobalValue::ExternalLinkage, nullptr, "g"); |
| 180 | + |
| 181 | + auto *F = cast<Function>(M.getOrInsertFunction( |
| 182 | + "f", FunctionType::get(Type::getVoidTy(C), false))); |
| 183 | + IRBuilder<> Builder(BasicBlock::Create(C, "", F)); |
| 184 | + Builder.CreateUnreachable(); |
| 185 | + F->setSubprogram(DIB.createFunction(CU, "f", "f", |
| 186 | + DIB.createFile("broken.c", "/"), 1, |
| 187 | + nullptr, true, true, 1)); |
| 188 | + DIB.finalize(); |
| 189 | + EXPECT_FALSE(verifyModule(M)); |
| 190 | + |
| 191 | + // Now break it by not listing the CU at all. |
| 192 | + M.eraseNamedMetadata(M.getOrInsertNamedMetadata("llvm.dbg.cu")); |
| 193 | + EXPECT_TRUE(verifyModule(M)); |
| 194 | + |
| 195 | + ModulePassManager MPM(true); |
| 196 | + MPM.addPass(VerifierPass(false)); |
| 197 | + ModuleAnalysisManager MAM(true); |
| 198 | + MAM.registerPass(VerifierAnalysis()); |
| 199 | + MPM.run(M, &MAM); |
| 200 | + EXPECT_FALSE(verifyModule(M)); |
| 201 | + } |
169 | 202 | }
|
170 | 203 |
|
171 | 204 |
|
|
0 commit comments