示例#1
0
/**
 * Print the list of external methods.
 */
void JVMWriter::printExternalMethods() {
    out << "; External methods\n";
    for(Module::const_iterator i = module->begin(),
                               e = module->end(); i != e; i++) {
        if(i->isDeclaration() && !i->isIntrinsic()) {
            const Function *f = i;
            const FunctionType *ty = f->getFunctionType();
            out << ".extern method "
                << getValueName(f) << getCallSignature(ty);
            if(debug >= 3)
                out << " ; " << *ty;
            out << '\n';
            externRefs.insert(f);
        }
    }
    out << '\n';
}
bool PNaClABIVerifyModule::runOnModule(Module &M) {
  if (!M.getModuleInlineAsm().empty()) {
    Reporter->addError() <<
        "Module contains disallowed top-level inline assembly\n";
  }

  for (Module::const_global_iterator MI = M.global_begin(), ME = M.global_end();
       MI != ME; ++MI) {
    checkGlobalIsFlattened(MI);
    checkGlobalValueCommon(MI);

    if (MI->isThreadLocal()) {
      Reporter->addError() << "Variable " << MI->getName() <<
          " has disallowed \"thread_local\" attribute\n";
    }
  }

  // No aliases allowed for now.
  for (Module::alias_iterator MI = M.alias_begin(),
           E = M.alias_end(); MI != E; ++MI) {
    Reporter->addError() << "Variable " << MI->getName() <<
        " is an alias (disallowed)\n";
  }

  for (Module::const_iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI) {
    if (MI->isIntrinsic()) {
      // Check intrinsics.
      if (!isWhitelistedIntrinsic(MI, MI->getIntrinsicID())) {
        Reporter->addError() << "Function " << MI->getName()
                             << " is a disallowed LLVM intrinsic\n";
      }
    } else {
      // Check types of functions and their arguments.  Not necessary
      // for intrinsics, whose types are fixed anyway, and which have
      // argument types that we disallow such as i8.
      if (!PNaClABITypeChecker::isValidFunctionType(MI->getFunctionType())) {
        Reporter->addError() << "Function " << MI->getName()
            << " has disallowed type: "
            << PNaClABITypeChecker::getTypeName(MI->getFunctionType())
            << "\n";
      }
      // This check is disabled in streaming mode because it would
      // reject a function that is defined but not read in yet.
      // Unfortunately this means we simply don't check this property
      // when translating a pexe in the browser.
      // TODO(mseaborn): Enforce this property in the bitcode reader.
      if (!StreamingMode && MI->isDeclaration()) {
        Reporter->addError() << "Function " << MI->getName()
                             << " is declared but not defined (disallowed)\n";
      }
      if (!MI->getAttributes().isEmpty()) {
        Reporter->addError()
            << "Function " << MI->getName() << " has disallowed attributes:"
            << getAttributesAsString(MI->getAttributes()) << "\n";
      }
      if (MI->getCallingConv() != CallingConv::C) {
        Reporter->addError()
            << "Function " << MI->getName()
            << " has disallowed calling convention: "
            << MI->getCallingConv() << "\n";
      }
    }

    checkGlobalValueCommon(MI);

    if (MI->hasGC()) {
      Reporter->addError() << "Function " << MI->getName() <<
          " has disallowed \"gc\" attribute\n";
    }
    // Knowledge of what function alignments are useful is
    // architecture-specific and sandbox-specific, so PNaCl pexes
    // should not be able to specify function alignment.
    if (MI->getAlignment() != 0) {
      Reporter->addError() << "Function " << MI->getName() <<
          " has disallowed \"align\" attribute\n";
    }
  }

  // Check named metadata nodes
  for (Module::const_named_metadata_iterator I = M.named_metadata_begin(),
           E = M.named_metadata_end(); I != E; ++I) {
    if (!isWhitelistedMetadata(I)) {
      Reporter->addError() << "Named metadata node " << I->getName()
                           << " is disallowed\n";
    }
  }

  Reporter->checkForFatalErrors();
  return false;
}