Exemplo n.º 1
0
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 %")
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
# 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: