示例#1
0
bool
ubsan_array_ref_instrumented_p (const_tree t)
{
  if (TREE_CODE (t) != ARRAY_REF)
    return false;

  tree op1 = TREE_OPERAND (t, 1);
  return TREE_CODE (op1) == COMPOUND_EXPR
	 && TREE_CODE (TREE_OPERAND (op1, 0)) == CALL_EXPR
	 && CALL_EXPR_FN (TREE_OPERAND (op1, 0)) == NULL_TREE
	 && CALL_EXPR_IFN (TREE_OPERAND (op1, 0)) == IFN_UBSAN_BOUNDS;
}
示例#2
0
void parseCallExprNode(CallExprNode *node)
{
    fillType(node);
    fillExprLocation(node);
    Log::dump(node);

// not recommended
//    fillExprOperands(node);

    if (CALL_EXPR_FN(node->gccNode) != NULL_TREE)
    {
        node->function = createParseNode(
            node,
            CALL_EXPR_FN(node->gccNode),
            "function");
    }
    else
    {
        node->functionName = internal_fn_name(CALL_EXPR_IFN (node->gccNode));
        Log::dump(node, "- function: %s", node->functionName.c_str());
    }

//    if (node->parseChilds <= 0)
//        return;

    const int argsCount = call_expr_nargs(node->gccNode);
    for (int f = 0; f < argsCount; f ++)
    {
        node->args.push_back(createParseNode(
            node,
            CALL_EXPR_ARG(node->gccNode, f),
            "arg"));
    }

    node->chain = createParseNode(
        node,
        CALL_EXPR_STATIC_CHAIN(node->gccNode),
        "chain");

    if (node->functionName == "LOAD_LANES")
        return;
}