Archive / / jsvmc.cpp
2011-05-31 10:15:04 UTC
previous next
#include <iostream> #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" using namespace llvm; #include "json.h" using namespace json; cl::opt<std::string> input_filename(cl::Positional, cl::desc("<input file>"), cl::init("-")); cl::opt<std::string> output_filename("o", cl::desc("Specify output filename"), cl::value_desc("filename")); class JsonGen { public: JsonObject get_json_for_module(Module* m) { JsonObject root(JsonObject::AssocArray); root["jsvm-json-version"] = 1; root["module-id"] = module->getModuleIdentifier(); root["data-layout"] = module->getDataLayout(); root["target-triple"] = module->getTargetTriple(); root["functions"] = JsonObject(JsonObject::Array); std::map<Function*, int> func_ptr_to_js_index; int current_func_js_index = 0; Module::iterator func_iter; for (func_iter = module->begin(); func_iter != module->end(); func_iter++) { func_ptr_to_js_index[&*func_iter] = current_func_js_index; root["functions"][current_func_js_index] = JsonObject(JsonObject::AssocArray); root["functions"][current_func_js_index]["basic-blocks"] = JsonObject(JsonObject::Array); Function::iterator basic_block_iter; std::map<BasicBlock*, int> basic_block_ptr_to_js_index; int current_basic_block_js_index = 0; for (basic_block_iter = func_iter->begin(); basic_block_iter != func_iter->end(); basic_block_iter++) { basic_block_ptr_to_js_index[&*basic_block_iter] = current_basic_block_js_index; root["functions"][current_func_js_index]["basic-blocks"][current_basic_block_js_index] } } return root; } JsonObject get_json_for_function(Function* f) { } JsonObject get_json_for_basic_block(BasicBlock* b) { } JsonObject get_json_for_instruction } int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv); LLVMContext &context = getGlobalContext(); if (output_filename.empty()) { if (input_filename == "-") { output_filename = "-"; } else { const std::string &IFN = input_filename; int len = IFN.length(); // If the source ends in .bc, strip it off. if (IFN[len-3] == '.' && IFN[len-2] == 'b' && IFN[len-1] == 'c') output_filename = std::string(IFN.begin(), IFN.end()-3)+".jsvm.json"; else output_filename = IFN+".jsvm.json"; } } std::cout << "input file: " << input_filename << std::endl; std::cout << "output file: " << output_filename << std::endl; std::string error_message; std::auto_ptr<Module> module; { OwningPtr<MemoryBuffer> buffer_ptr; buffer_ptr.reset(MemoryBuffer::getFileOrSTDIN(input_filename, &error_message)); if (buffer_ptr.get() == 0) { std::cout << "error opening " << input_filename << ": " << error_message << std::endl; return 0; } module.reset(ParseBitcodeFile(buffer_ptr.get(), getGlobalContext(), &error_message)); if (module.get() == 0) { std::cout << "error parsing " << input_filename << ": " << error_message << std::endl; return 0; } } std::cout << root.to_string() << std::endl; return 0; }