mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +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:
@ -19,6 +19,7 @@
|
|||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/Timer.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -172,7 +173,8 @@ bool BUDataStructures::runOnModule(Module &M) {
|
|||||||
std::set<GlobalValue*> ECGlobals;
|
std::set<GlobalValue*> ECGlobals;
|
||||||
BuildGlobalECs(*GlobalsGraph, ECGlobals);
|
BuildGlobalECs(*GlobalsGraph, ECGlobals);
|
||||||
if (!ECGlobals.empty()) {
|
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(),
|
for (hash_map<Function*, DSGraph*>::iterator I = DSInfo.begin(),
|
||||||
E = DSInfo.end(); I != E; ++I)
|
E = DSInfo.end(); I != E; ++I)
|
||||||
EliminateUsesOfECGlobals(*I->second, ECGlobals);
|
EliminateUsesOfECGlobals(*I->second, ECGlobals);
|
||||||
@ -225,7 +227,8 @@ static bool isVAHackFn(const Function *F) {
|
|||||||
return F->getName() == "printf" || F->getName() == "sscanf" ||
|
return F->getName() == "printf" || F->getName() == "sscanf" ||
|
||||||
F->getName() == "fprintf" || F->getName() == "open" ||
|
F->getName() == "fprintf" || F->getName() == "open" ||
|
||||||
F->getName() == "sprintf" || F->getName() == "fputs" ||
|
F->getName() == "sprintf" || F->getName() == "fputs" ||
|
||||||
F->getName() == "fscanf";
|
F->getName() == "fscanf" || F->getName() == "malloc" ||
|
||||||
|
F->getName() == "free";
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isResolvableFunc(const Function* callee) {
|
static bool isResolvableFunc(const Function* callee) {
|
||||||
@ -404,6 +407,32 @@ void BUDataStructures::releaseMyMemory() {
|
|||||||
GlobalsGraph = 0;
|
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) {
|
void BUDataStructures::calculateGraph(DSGraph &Graph) {
|
||||||
// Move our call site list into TempFCs so that inline call sites go into the
|
// 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!
|
// new call site list and doesn't invalidate our iterators!
|
||||||
|
Reference in New Issue
Block a user