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; }
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; }