Exemplo n.º 1
0
void FaultLogger::buildFaultRecord(SysLFS::FaultRecordSvm *buffer)
{
    memset(buffer, SENTINEL, sizeof *buffer);

    buffer->header = header;
    buffer->cubes = cubes;
    buffer->regs = regs;

    // Save the top of the stack
    safeMemoryDump(buffer->mem.stack, buffer->regs.sp, sizeof buffer->mem.stack);

    // Save the code page (which we stashed in anonyous memory earlier)
    if (codePage.isHeld()) {
        memcpy(buffer->mem.codePage, codePage->getData(), FlashBlock::BLOCK_SIZE);
        codePage.release();
    }

    // Save volume metadata
    FlashVolume vol = FlashMapBlock::fromCode(header.runningVolume);
    if (vol.isValid()) {
        FlashBlockRef mapRef;
        Elf::Program program;
        if (program.init(vol.getPayload(mapRef))) {
            dumpMetadata(program, _SYS_METADATA_UUID, &buffer->vol.uuid, sizeof buffer->vol.uuid);
            dumpMetadata(program, _SYS_METADATA_PACKAGE_STR, &buffer->vol.package, sizeof buffer->vol.package);
            dumpMetadata(program, _SYS_METADATA_VERSION_STR, &buffer->vol.version, sizeof buffer->vol.version);
        }
    }
}
Exemplo n.º 2
0
int main(int argc, char** argv) {
  if(!parseOption(argc, argv)) {
    fprintf(stderr, "failed to parse option\n");
    return 1;
  }

  const char *bitcode = NULL;
  size_t bitcodeSize = readBitcode(&bitcode);

  unsigned int version = 0;

  bcinfo::BitcodeWrapper bcWrapper((const char *)bitcode, bitcodeSize);
  if (bcWrapper.getBCFileType() == bcinfo::BC_WRAPPER) {
    version = bcWrapper.getTargetAPI();
    if (verbose) {
      printf("Found bitcodeWrapper\n");
    }
  } else if (translateFlag) {
    version = 12;
  }

  if (verbose) {
    printf("targetAPI: %u\n", version);
    printf("compilerVersion: %u\n", bcWrapper.getCompilerVersion());
    printf("optimizationLevel: %u\n\n", bcWrapper.getOptimizationLevel());
  }

  llvm::OwningPtr<bcinfo::BitcodeTranslator> BT;
  BT.reset(new bcinfo::BitcodeTranslator(bitcode, bitcodeSize, version));
  if (!BT->translate()) {
    fprintf(stderr, "failed to translate bitcode\n");
    return 3;
  }

  llvm::OwningPtr<bcinfo::MetadataExtractor> ME;
  ME.reset(new bcinfo::MetadataExtractor(BT->getTranslatedBitcode(),
                                         BT->getTranslatedBitcodeSize()));
  if (!ME->extract()) {
    fprintf(stderr, "failed to get metadata\n");
    return 4;
  }

  if (verbose) {
    dumpMetadata(ME.get());

    const char *translatedBitcode = BT->getTranslatedBitcode();
    size_t translatedBitcodeSize = BT->getTranslatedBitcodeSize();

    llvm::LLVMContext &ctx = llvm::getGlobalContext();
    llvm::llvm_shutdown_obj called_on_exit;

    llvm::OwningPtr<llvm::MemoryBuffer> mem;

    mem.reset(llvm::MemoryBuffer::getMemBuffer(
        llvm::StringRef(translatedBitcode, translatedBitcodeSize),
        inFile.c_str(), false));

    llvm::OwningPtr<llvm::Module> module;
    std::string errmsg;
    module.reset(llvm::ParseBitcodeFile(mem.get(), ctx, &errmsg));
    if (module.get() != 0 && module->MaterializeAllPermanently(&errmsg)) {
      module.reset();
    }

    if (module.get() == 0) {
      if (errmsg.size()) {
        fprintf(stderr, "error: %s\n", errmsg.c_str());
      } else {
        fprintf(stderr, "error: failed to parse bitcode file\n");
      }
      return 5;
    }

    llvm::OwningPtr<llvm::tool_output_file> tof(
        new llvm::tool_output_file(outFile.c_str(), errmsg,
                                   llvm::sys::fs::F_Binary));
    llvm::OwningPtr<llvm::AssemblyAnnotationWriter> ann;
    module->print(tof->os(), ann.get());

    tof->keep();
  }

  if (infoFlag) {
    if (dumpInfo(ME.get()) != 0) {
      fprintf(stderr, "Error dumping info file\n");
      return 6;
    }
  }

  releaseBitcode(&bitcode);

  return 0;
}