blob: 72427e74d6821b621521c79c7121eebe4bad1e2a [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software 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.
#ifndef IMPALA_CODEGEN_CODEGEN_CALLGRAPH_H
#define IMPALA_CODEGEN_CODEGEN_CALLGRAPH_H
#include <boost/unordered_map.hpp>
#include <boost/unordered_set.hpp>
#include <llvm/IR/Module.h>
#include "codegen/llvm-codegen.h"
namespace impala {
/// This class implements the callgraph of functions in a LLVM module.
class CodegenCallGraph {
public:
/// Creates an uninitialized call graph.
CodegenCallGraph() : inited_(false) { }
/// Initializes the call graph based on the functions defined in 'module'.
void Init(llvm::Module* module);
/// Returns the callees of the function with name 'fn_name'.
/// Returns NULL if the function is not found in the call graph.
const boost::unordered_set<std::string>* GetCallees(const std::string& fn_name) const {
DCHECK(inited_);
CallGraph::const_iterator iter = call_graph_.find(fn_name);
return LIKELY(iter != call_graph_.end()) ? &iter->second : nullptr;
}
/// Returns the set of functions referenced by global variables in 'module'
const boost::unordered_set<std::string>& fns_referenced_by_gv() const {
DCHECK(inited_);
return fns_referenced_by_gv_;
}
private:
bool inited_;
/// Map of functions' names to their callee functions' names.
typedef boost::unordered_map<std::string, boost::unordered_set<std::string>> CallGraph;
CallGraph call_graph_;
/// The set of all functions referenced by global variables.
/// They always need to be materialized.
boost::unordered_set<std::string> fns_referenced_by_gv_;
/// Returns true if the function 'fn' is defined in the Impalad native code.
static bool IsDefinedInImpalad(const std::string& fn);
/// Find all global variables and functions which reference the llvm::Value 'val'
/// and append them to 'users'.
static void FindGlobalUsers(llvm::User* val, std::vector<llvm::GlobalObject*>* users);
};
}
#endif