mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[weak vtables] Remove a bunch of weak vtables
This patch removes most of the trivial cases of weak vtables by pinning them to a single object file. The memory leaks in this version have been fixed. Thanks Alexey for pointing them out. Differential Revision: http://llvm-reviews.chandlerc.com/D2068 Reviewed by Andy git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195064 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -38,12 +38,16 @@ static void dumpIdxVec(const SmallVectorImpl<unsigned> &V) {
|
||||
|
||||
// (instrs a, b, ...) Evaluate and union all arguments. Identical to AddOp.
|
||||
struct InstrsOp : public SetTheory::Operator {
|
||||
void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc) {
|
||||
ST.evaluate(Expr->arg_begin(), Expr->arg_end(), Elts, Loc);
|
||||
}
|
||||
virtual void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc);
|
||||
};
|
||||
|
||||
// Provide out-of-line definition to prevent weak vtable.
|
||||
void InstrsOp::apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc) {
|
||||
ST.evaluate(Expr->arg_begin(), Expr->arg_end(), Elts, Loc);
|
||||
}
|
||||
|
||||
// (instregex "OpcPat",...) Find all instructions matching an opcode pattern.
|
||||
//
|
||||
// TODO: Since this is a prefix match, perform a binary search over the
|
||||
@@ -56,35 +60,39 @@ struct InstRegexOp : public SetTheory::Operator {
|
||||
const CodeGenTarget &Target;
|
||||
InstRegexOp(const CodeGenTarget &t): Target(t) {}
|
||||
|
||||
void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc) {
|
||||
SmallVector<Regex*, 4> RegexList;
|
||||
for (DagInit::const_arg_iterator
|
||||
AI = Expr->arg_begin(), AE = Expr->arg_end(); AI != AE; ++AI) {
|
||||
StringInit *SI = dyn_cast<StringInit>(*AI);
|
||||
if (!SI)
|
||||
PrintFatalError(Loc, "instregex requires pattern string: "
|
||||
+ Expr->getAsString());
|
||||
std::string pat = SI->getValue();
|
||||
// Implement a python-style prefix match.
|
||||
if (pat[0] != '^') {
|
||||
pat.insert(0, "^(");
|
||||
pat.insert(pat.end(), ')');
|
||||
}
|
||||
RegexList.push_back(new Regex(pat));
|
||||
}
|
||||
for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
|
||||
E = Target.inst_end(); I != E; ++I) {
|
||||
for (SmallVectorImpl<Regex*>::iterator
|
||||
RI = RegexList.begin(), RE = RegexList.end(); RI != RE; ++RI) {
|
||||
if ((*RI)->match((*I)->TheDef->getName()))
|
||||
Elts.insert((*I)->TheDef);
|
||||
}
|
||||
}
|
||||
DeleteContainerPointers(RegexList);
|
||||
}
|
||||
virtual void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc);
|
||||
};
|
||||
|
||||
// Provide out-of-line definition to prevent weak vtable.
|
||||
void InstRegexOp::apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
|
||||
ArrayRef<SMLoc> Loc) {
|
||||
SmallVector<Regex*, 4> RegexList;
|
||||
for (DagInit::const_arg_iterator
|
||||
AI = Expr->arg_begin(), AE = Expr->arg_end(); AI != AE; ++AI) {
|
||||
StringInit *SI = dyn_cast<StringInit>(*AI);
|
||||
if (!SI)
|
||||
PrintFatalError(Loc, "instregex requires pattern string: "
|
||||
+ Expr->getAsString());
|
||||
std::string pat = SI->getValue();
|
||||
// Implement a python-style prefix match.
|
||||
if (pat[0] != '^') {
|
||||
pat.insert(0, "^(");
|
||||
pat.insert(pat.end(), ')');
|
||||
}
|
||||
RegexList.push_back(new Regex(pat));
|
||||
}
|
||||
for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
|
||||
E = Target.inst_end(); I != E; ++I) {
|
||||
for (SmallVectorImpl<Regex*>::iterator
|
||||
RI = RegexList.begin(), RE = RegexList.end(); RI != RE; ++RI) {
|
||||
if ((*RI)->match((*I)->TheDef->getName()))
|
||||
Elts.insert((*I)->TheDef);
|
||||
}
|
||||
}
|
||||
DeleteContainerPointers(RegexList);
|
||||
}
|
||||
|
||||
/// CodeGenModels ctor interprets machine model records and populates maps.
|
||||
CodeGenSchedModels::CodeGenSchedModels(RecordKeeper &RK,
|
||||
const CodeGenTarget &TGT):
|
||||
|
Reference in New Issue
Block a user