Chromium Code Reviews| Index: lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
| diff --git a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
| index 88914c85a8a336b85630a35d754c213ac2ba9c05..5055a58223a8ae8e9350dca4e19f8b9c28a78ff7 100644 |
| --- a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
| +++ b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
| @@ -31,13 +31,16 @@ class PNaClABIVerifyModule : public ModulePass { |
| PNaClABIVerifyModule() : |
| ModulePass(ID), |
| Reporter(new PNaClABIErrorReporter), |
| - ReporterIsOwned(true) { |
| + ReporterIsOwned(true), |
| + AllowDebugMetadata(false) { |
| initializePNaClABIVerifyModulePass(*PassRegistry::getPassRegistry()); |
| } |
| - explicit PNaClABIVerifyModule(PNaClABIErrorReporter *Reporter_) : |
| + PNaClABIVerifyModule(PNaClABIErrorReporter *Reporter_, |
| + bool AllowDebugMetadata_) : |
| ModulePass(ID), |
| Reporter(Reporter_), |
| - ReporterIsOwned(false) { |
| + ReporterIsOwned(false), |
| + AllowDebugMetadata(AllowDebugMetadata_) { |
|
Mark Seaborn
2013/04/25 18:04:32
Same style comment as other file
|
| initializePNaClABIVerifyModulePass(*PassRegistry::getPassRegistry()); |
| } |
| ~PNaClABIVerifyModule() { |
| @@ -48,9 +51,11 @@ class PNaClABIVerifyModule : public ModulePass { |
| virtual void print(raw_ostream &O, const Module *M) const; |
| private: |
| void CheckGlobalValueCommon(const GlobalValue *GV); |
| + bool WhiteListedMetadata(const NamedMDNode *MD); |
| PNaClABITypeChecker TC; |
| PNaClABIErrorReporter *Reporter; |
| bool ReporterIsOwned; |
| + bool AllowDebugMetadata; |
| }; |
| static const char *linkageName(GlobalValue::LinkageTypes LT) { |
| @@ -105,6 +110,10 @@ void PNaClABIVerifyModule::CheckGlobalValueCommon(const GlobalValue *GV) { |
| } |
| } |
| +bool PNaClABIVerifyModule::WhiteListedMetadata(const NamedMDNode* MD) { |
| + return MD->getName().startswith("llvm.dbg") && AllowDebugMetadata; |
|
Mark Seaborn
2013/04/25 18:04:32
Maybe "llvm.dbg." (trailing dot) to be stricter?
jvoung (off chromium)
2013/04/25 23:22:20
Done.
|
| +} |
| + |
| bool PNaClABIVerifyModule::runOnModule(Module &M) { |
| for (Module::const_global_iterator MI = M.global_begin(), ME = M.global_end(); |
| MI != ME; ++MI) { |
| @@ -174,11 +183,17 @@ bool PNaClABIVerifyModule::runOnModule(Module &M) { |
| // Check named metadata nodes |
| for (Module::const_named_metadata_iterator I = M.named_metadata_begin(), |
| E = M.named_metadata_end(); I != E; ++I) { |
| - for (unsigned i = 0, e = I->getNumOperands(); i != e; i++) { |
| - if (Type *T = TC.checkTypesInMDNode(I->getOperand(i))) { |
| - Reporter->addError() << "Named metadata node " << I->getName() << |
| - " refers to disallowed type: " << |
| - PNaClABITypeChecker::getTypeName(T) << "\n"; |
| + if (!WhiteListedMetadata(I)) { |
| + Reporter->addError() << "Named metadata node " << I->getName() |
| + << " is disallowed\n"; |
| + } else { |
| + // Check the types in the metadata. |
| + for (unsigned i = 0, e = I->getNumOperands(); i != e; i++) { |
| + if (Type *T = TC.checkTypesInMDNode(I->getOperand(i))) { |
| + Reporter->addError() << "Named metadata node " << I->getName() |
| + << " refers to disallowed type: " |
| + << PNaClABITypeChecker::getTypeName(T) << "\n"; |
| + } |
| } |
| } |
| } |
| @@ -201,6 +216,7 @@ INITIALIZE_PASS(PNaClABIVerifyModule, "verify-pnaclabi-module", |
| "Verify module for PNaCl", false, true) |
| ModulePass *llvm::createPNaClABIVerifyModulePass( |
| - PNaClABIErrorReporter *Reporter) { |
| - return new PNaClABIVerifyModule(Reporter); |
| + PNaClABIErrorReporter *Reporter, |
| + bool AllowDebugMetadata) { |
| + return new PNaClABIVerifyModule(Reporter, AllowDebugMetadata); |
| } |