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); } } }
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; }