mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
add support for taking and resolving the address of free.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21396 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
07753cecb9
commit
a5ed1bd00b
@ -19,6 +19,7 @@
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/Timer.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
@ -172,7 +173,8 @@ bool BUDataStructures::runOnModule(Module &M) {
|
||||
std::set<GlobalValue*> ECGlobals;
|
||||
BuildGlobalECs(*GlobalsGraph, ECGlobals);
|
||||
if (!ECGlobals.empty()) {
|
||||
DEBUG(std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n");
|
||||
NamedRegionTimer X("Bottom-UP EC Cleanup");
|
||||
std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n";
|
||||
for (hash_map<Function*, DSGraph*>::iterator I = DSInfo.begin(),
|
||||
E = DSInfo.end(); I != E; ++I)
|
||||
EliminateUsesOfECGlobals(*I->second, ECGlobals);
|
||||
@ -225,7 +227,8 @@ static bool isVAHackFn(const Function *F) {
|
||||
return F->getName() == "printf" || F->getName() == "sscanf" ||
|
||||
F->getName() == "fprintf" || F->getName() == "open" ||
|
||||
F->getName() == "sprintf" || F->getName() == "fputs" ||
|
||||
F->getName() == "fscanf";
|
||||
F->getName() == "fscanf" || F->getName() == "malloc" ||
|
||||
F->getName() == "free";
|
||||
}
|
||||
|
||||
static bool isResolvableFunc(const Function* callee) {
|
||||
@ -404,6 +407,32 @@ void BUDataStructures::releaseMyMemory() {
|
||||
GlobalsGraph = 0;
|
||||
}
|
||||
|
||||
DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) {
|
||||
Function *F = const_cast<Function*>(&Fn);
|
||||
DSGraph *DSG = new DSGraph(GlobalECs, GlobalsGraph->getTargetData());
|
||||
DSInfo[F] = DSG;
|
||||
DSG->setGlobalsGraph(GlobalsGraph);
|
||||
DSG->setPrintAuxCalls();
|
||||
|
||||
// Add function to the graph.
|
||||
DSG->getReturnNodes().insert(std::make_pair(F, DSNodeHandle()));
|
||||
|
||||
if (F->getName() == "free") { // Taking the address of free.
|
||||
|
||||
// Free should take a single pointer argument, mark it as heap memory.
|
||||
DSNode *N = new DSNode(0, DSG);
|
||||
N->setHeapNodeMarker();
|
||||
DSG->getNodeForValue(F->arg_begin()).mergeWith(N);
|
||||
|
||||
} else {
|
||||
std::cerr << "Unrecognized external function: " << F->getName() << "\n";
|
||||
abort();
|
||||
}
|
||||
|
||||
return *DSG;
|
||||
}
|
||||
|
||||
|
||||
void BUDataStructures::calculateGraph(DSGraph &Graph) {
|
||||
// Move our call site list into TempFCs so that inline call sites go into the
|
||||
// new call site list and doesn't invalidate our iterators!
|
||||
|
Loading…
Reference in New Issue
Block a user