def test_simple_ir(): """Test equivalence of nodes that pre-process to the same text.""" options = program_graph_options_pb2.ProgramGraphOptions(opt_level=3) proto = llvm.BuildProgramGraph(SIMPLE_IR, options) assert isinstance(proto, program_graph_pb2.ProgramGraph) assert len(proto.module) == 1 assert proto.module[0].name == "foo.c" assert len(proto.node) == 6 assert proto.node[0].text == "[external]" assert proto.node[0].type == node_pb2.Node.INSTRUCTION assert proto.node[1].text == "add" assert proto.node[1].type == node_pb2.Node.INSTRUCTION assert GetStringScalar(proto.node[1], "full_text") == "%3 = add nsw i32 %1, %0" assert proto.node[2].text == "ret" assert proto.node[2].type == node_pb2.Node.INSTRUCTION assert GetStringScalar(proto.node[2], "full_text") == "ret i32 %3" assert proto.node[3].text == "i32" assert proto.node[3].type == node_pb2.Node.VARIABLE assert GetStringScalar(proto.node[3], "full_text") == "i32 %3" # Use startswith() to compare names for these last two variables as thier # order may differ. assert proto.node[4].text == "i32" assert proto.node[4].type == node_pb2.Node.VARIABLE assert GetStringScalar(proto.node[4], "full_text").startswith("i32 %") assert proto.node[5].text == "i32" assert proto.node[5].type == node_pb2.Node.VARIABLE assert GetStringScalar(proto.node[5], "full_text").startswith("i32 %")
def test_opt_level(): """Test equivalence of nodes that pre-process to the same text.""" options = program_graph_options_pb2.ProgramGraphOptions(opt_level=0, ) unoptimized = llvm.BuildProgramGraph(SIMPLE_IR) options.opt_level = 3 optimized = llvm.BuildProgramGraph(SIMPLE_IR, options) assert len(optimized.node) < len(unoptimized.node)
# distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Python interface for building program graphs from LLVM-IR.""" import subprocess import tempfile from labm8.py import bazelutil from programl.proto import program_graph_options_pb2, program_graph_pb2 GRAPH_BUILDER_BIN = bazelutil.DataPath( "programl/programl/ir/llvm/py/graph_builder_bin") DefaultOptions = program_graph_options_pb2.ProgramGraphOptions() def BuildProgramGraph( ir: str, options: program_graph_options_pb2.ProgramGraphOptions = DefaultOptions, timeout: int = 60, ) -> program_graph_pb2.ProgramGraph: """Construct a program graph from an LLVM-IR. Args: ir: The text of an LLVM-IR Module. options: The graph construction options. timeout: The number of seconds to permit before timing out. Returns: