| 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_) {
|
| 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;
|
| +}
|
| +
|
| 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);
|
| }
|
|
|