// compiled with g++ (Debian 4.7.2-5) 4.7.2 with !g++ -Wall -std=c++11 -O2 -lboost_system -lboost_graph -o boost-test boost-test.cpp #include #include // test_dot[] is from xxd -i test.dot with 0x00 added at the end (to null-terminate) // where test.dot is inside #if 0: #if 0 digraph "flow_graph" { graph [ ]; node [ shape = "box" ]; edge [ ]; "0" [ label = "_WinMainCRTStartup:\lpush ebp\lmov ebp, esp\lsub esp, 18h\land esp, 0FFFFFFF0h\lmov [esp+18h+var_18], offset _main\lcall _cygwin_crt0\lmov [esp+18h+var_10], 0\lmov [esp+18h+var_14], 0\lmov [esp+18h+var_18], 0\lcall _cygwin_premain0\lmov [esp+18h+var_10], 0\lmov [esp+18h+var_14], 0\lmov [esp+18h+var_18], 0\lcall _cygwin_premain1\lmov [esp+18h+var_10], 0\lmov [esp+18h+var_14], 0\lmov [esp+18h+var_18], 0\lcall _cygwin_premain2\lmov [esp+18h+var_10], 0\lmov [esp+18h+var_14], 0\lmov [esp+18h+var_18], 0\lcall _cygwin_premain3\lleave\lretn\l" ]; // node 0 } #endif unsigned char test_dot[] = { 0x64, 0x69, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x22, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x22, 0x20, 0x7b, 0x0d, 0x0a, 0x09, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x5b, 0x0d, 0x0a, 0x09, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x5b, 0x0d, 0x0a, 0x09, 0x09, 0x73, 0x68, 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x78, 0x22, 0x0d, 0x0a, 0x09, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x64, 0x67, 0x65, 0x20, 0x5b, 0x0d, 0x0a, 0x09, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x22, 0x30, 0x22, 0x20, 0x5b, 0x0d, 0x0a, 0x09, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x22, 0x5f, 0x57, 0x69, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x43, 0x52, 0x54, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x3a, 0x5c, 0x6c, 0x70, 0x75, 0x73, 0x68, 0x20, 0x20, 0x20, 0x20, 0x65, 0x62, 0x70, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x62, 0x70, 0x2c, 0x20, 0x65, 0x73, 0x70, 0x5c, 0x6c, 0x73, 0x75, 0x62, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x70, 0x2c, 0x20, 0x31, 0x38, 0x68, 0x5c, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x70, 0x2c, 0x20, 0x30, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x30, 0x68, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x5d, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5c, 0x6c, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x79, 0x67, 0x77, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x74, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x79, 0x67, 0x77, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x79, 0x67, 0x77, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x31, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x79, 0x67, 0x77, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x32, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x6d, 0x6f, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x65, 0x73, 0x70, 0x2b, 0x31, 0x38, 0x68, 0x2b, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x5d, 0x2c, 0x20, 0x30, 0x5c, 0x6c, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x79, 0x67, 0x77, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x33, 0x5c, 0x6c, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x5c, 0x6c, 0x72, 0x65, 0x74, 0x6e, 0x5c, 0x6c, 0x22, 0x0d, 0x0a, 0x09, 0x5d, 0x3b, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x30, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a }; struct flow_graph_t_basic_block_properties { std::string label; std::string node_id; int vertex_color; }; typedef boost::adjacency_list flow_graph_t; typedef flow_graph_t::vertex_descriptor flow_graph_t_basic_block; typedef flow_graph_t::edge_descriptor flow_graph_t_branch; int main(int argc, char** argv) { std::string test_dot_str(test_dot, test_dot + sizeof(test_dot)); flow_graph_t fg; boost::dynamic_properties dp; dp.property("node_id", boost::get(&flow_graph_t_basic_block_properties::node_id, fg)); dp.property("label", boost::get(&flow_graph_t_basic_block_properties::label, fg)); try { if (!boost::read_graphviz(test_dot_str, fg, dp)) { std::cerr << "boost failure (0)" << std::endl; return 0; } } catch (std::exception& e) { std::cerr << "boost failure (1): " << e.what() << std::endl; } return 0; }