Index: lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
diff --git a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
index 88914c85a8a336b85630a35d754c213ac2ba9c05..a1818f7eb02ff5a273cd80345fd9046dc6649634 100644 |
--- a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
+++ b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp |
@@ -23,6 +23,13 @@ |
#include "PNaClABITypeChecker.h" |
using namespace llvm; |
+namespace llvm { |
+cl::opt<bool> |
+PNaClABIAllowDebugMetadata("pnaclabi-allow-debug-metadata", |
+ cl::desc("Allow debug metadata during PNaCl ABI verification."), |
+ cl::init(false)); |
+} |
+ |
namespace { |
// This pass should not touch function bodies, to stay streaming-friendly |
class PNaClABIVerifyModule : public ModulePass { |
@@ -48,6 +55,7 @@ class PNaClABIVerifyModule : public ModulePass { |
virtual void print(raw_ostream &O, const Module *M) const; |
private: |
void CheckGlobalValueCommon(const GlobalValue *GV); |
+ bool IsWhitelistedMetadata(const NamedMDNode *MD); |
PNaClABITypeChecker TC; |
PNaClABIErrorReporter *Reporter; |
bool ReporterIsOwned; |
@@ -105,6 +113,11 @@ void PNaClABIVerifyModule::CheckGlobalValueCommon(const GlobalValue *GV) { |
} |
} |
+bool PNaClABIVerifyModule::IsWhitelistedMetadata(const NamedMDNode* MD) { |
+ return MD->getName().startswith("llvm.dbg.") |
+ && llvm::PNaClABIAllowDebugMetadata; |
+} |
+ |
bool PNaClABIVerifyModule::runOnModule(Module &M) { |
for (Module::const_global_iterator MI = M.global_begin(), ME = M.global_end(); |
MI != ME; ++MI) { |
@@ -174,11 +187,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 (!IsWhitelistedMetadata(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"; |
+ } |
} |
} |
} |