| 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";
|
| + }
|
| }
|
| }
|
| }
|
|
|