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); |
} |