forked from OSchip/llvm-project
Don't create a SymbolTable in Function when the LLVMContext discards value names (NFC)
The ValueSymbolTable is used to detect name conflict and rename instructions automatically. This is not needed when the value names are automatically discarded by the LLVMContext. No functional change intended, just saving a little bit of memory. This is a recommit of r281806 after fixing the accessor to return a pointer instead of a reference and updating all the call-sites. llvm-svn: 281813
This commit is contained in:
parent
05188a646d
commit
a53d49e1b5
|
@ -50,7 +50,8 @@ private:
|
||||||
// Important things that make up a function!
|
// Important things that make up a function!
|
||||||
BasicBlockListType BasicBlocks; ///< The basic blocks
|
BasicBlockListType BasicBlocks; ///< The basic blocks
|
||||||
mutable ArgumentListType ArgumentList; ///< The formal arguments
|
mutable ArgumentListType ArgumentList; ///< The formal arguments
|
||||||
ValueSymbolTable *SymTab; ///< Symbol table of args/instructions
|
std::unique_ptr<ValueSymbolTable>
|
||||||
|
SymTab; ///< Symbol table of args/instructions
|
||||||
AttributeSet AttributeSets; ///< Parameter attributes
|
AttributeSet AttributeSets; ///< Parameter attributes
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -493,10 +494,12 @@ public:
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Symbol Table Accessing functions...
|
// Symbol Table Accessing functions...
|
||||||
|
|
||||||
/// getSymbolTable() - Return the symbol table...
|
/// getSymbolTable() - Return the symbol table if any, otherwise nullptr.
|
||||||
///
|
///
|
||||||
inline ValueSymbolTable &getValueSymbolTable() { return *SymTab; }
|
inline ValueSymbolTable *getValueSymbolTable() { return SymTab.get(); }
|
||||||
inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; }
|
inline const ValueSymbolTable *getValueSymbolTable() const {
|
||||||
|
return SymTab.get();
|
||||||
|
}
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// BasicBlock iterator forwarding functions
|
// BasicBlock iterator forwarding functions
|
||||||
|
|
|
@ -2504,7 +2504,7 @@ bool LLParser::PerFunctionState::FinishFunction() {
|
||||||
Value *LLParser::PerFunctionState::GetVal(const std::string &Name, Type *Ty,
|
Value *LLParser::PerFunctionState::GetVal(const std::string &Name, Type *Ty,
|
||||||
LocTy Loc) {
|
LocTy Loc) {
|
||||||
// Look this name up in the normal function symbol table.
|
// Look this name up in the normal function symbol table.
|
||||||
Value *Val = F.getValueSymbolTable().lookup(Name);
|
Value *Val = F.getValueSymbolTable()->lookup(Name);
|
||||||
|
|
||||||
// If this is a forward reference for the value, see if we already created a
|
// If this is a forward reference for the value, see if we already created a
|
||||||
// forward ref record.
|
// forward ref record.
|
||||||
|
@ -2922,7 +2922,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
|
||||||
return Error(Label.Loc, "cannot take address of numeric label after "
|
return Error(Label.Loc, "cannot take address of numeric label after "
|
||||||
"the function is defined");
|
"the function is defined");
|
||||||
BB = dyn_cast_or_null<BasicBlock>(
|
BB = dyn_cast_or_null<BasicBlock>(
|
||||||
F->getValueSymbolTable().lookup(Label.StrVal));
|
F->getValueSymbolTable()->lookup(Label.StrVal));
|
||||||
if (!BB)
|
if (!BB)
|
||||||
return Error(Label.Loc, "referenced value is not a basic block");
|
return Error(Label.Loc, "referenced value is not a basic block");
|
||||||
}
|
}
|
||||||
|
@ -6507,7 +6507,7 @@ bool LLParser::ParseUseListOrderBB() {
|
||||||
return Error(Label.Loc, "invalid numeric label in uselistorder_bb");
|
return Error(Label.Loc, "invalid numeric label in uselistorder_bb");
|
||||||
if (Label.Kind != ValID::t_LocalName)
|
if (Label.Kind != ValID::t_LocalName)
|
||||||
return Error(Label.Loc, "expected basic block name in uselistorder_bb");
|
return Error(Label.Loc, "expected basic block name in uselistorder_bb");
|
||||||
Value *V = F->getValueSymbolTable().lookup(Label.StrVal);
|
Value *V = F->getValueSymbolTable()->lookup(Label.StrVal);
|
||||||
if (!V)
|
if (!V)
|
||||||
return Error(Label.Loc, "invalid basic block in uselistorder_bb");
|
return Error(Label.Loc, "invalid basic block in uselistorder_bb");
|
||||||
if (!isa<BasicBlock>(V))
|
if (!isa<BasicBlock>(V))
|
||||||
|
|
|
@ -2999,7 +2999,8 @@ void ModuleBitcodeWriter::writeFunction(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit names for all the instructions etc.
|
// Emit names for all the instructions etc.
|
||||||
writeValueSymbolTable(F.getValueSymbolTable());
|
if (auto *Symtab = F.getValueSymbolTable())
|
||||||
|
writeValueSymbolTable(*Symtab);
|
||||||
|
|
||||||
if (NeedsMetadataAttachment)
|
if (NeedsMetadataAttachment)
|
||||||
writeFunctionMetadataAttachment(F);
|
writeFunctionMetadataAttachment(F);
|
||||||
|
|
|
@ -364,7 +364,7 @@ bool MIParser::parseBasicBlockDefinition(
|
||||||
|
|
||||||
if (!Name.empty()) {
|
if (!Name.empty()) {
|
||||||
BB = dyn_cast_or_null<BasicBlock>(
|
BB = dyn_cast_or_null<BasicBlock>(
|
||||||
MF.getFunction()->getValueSymbolTable().lookup(Name));
|
MF.getFunction()->getValueSymbolTable()->lookup(Name));
|
||||||
if (!BB)
|
if (!BB)
|
||||||
return error(Loc, Twine("basic block '") + Name +
|
return error(Loc, Twine("basic block '") + Name +
|
||||||
"' is not defined in the function '" +
|
"' is not defined in the function '" +
|
||||||
|
@ -1383,7 +1383,7 @@ bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) {
|
||||||
switch (Token.kind()) {
|
switch (Token.kind()) {
|
||||||
case MIToken::NamedIRBlock: {
|
case MIToken::NamedIRBlock: {
|
||||||
BB = dyn_cast_or_null<BasicBlock>(
|
BB = dyn_cast_or_null<BasicBlock>(
|
||||||
F.getValueSymbolTable().lookup(Token.stringValue()));
|
F.getValueSymbolTable()->lookup(Token.stringValue()));
|
||||||
if (!BB)
|
if (!BB)
|
||||||
return error(Twine("use of undefined IR block '") + Token.range() + "'");
|
return error(Twine("use of undefined IR block '") + Token.range() + "'");
|
||||||
break;
|
break;
|
||||||
|
@ -1729,7 +1729,7 @@ bool MIParser::parseOperandsOffset(MachineOperand &Op) {
|
||||||
bool MIParser::parseIRValue(const Value *&V) {
|
bool MIParser::parseIRValue(const Value *&V) {
|
||||||
switch (Token.kind()) {
|
switch (Token.kind()) {
|
||||||
case MIToken::NamedIRValue: {
|
case MIToken::NamedIRValue: {
|
||||||
V = MF.getFunction()->getValueSymbolTable().lookup(Token.stringValue());
|
V = MF.getFunction()->getValueSymbolTable()->lookup(Token.stringValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MIToken::IRValue: {
|
case MIToken::IRValue: {
|
||||||
|
|
|
@ -552,7 +552,7 @@ bool MIRParserImpl::initializeFrameInfo(PerFunctionMIParsingState &PFS,
|
||||||
const yaml::StringValue &Name = Object.Name;
|
const yaml::StringValue &Name = Object.Name;
|
||||||
if (!Name.Value.empty()) {
|
if (!Name.Value.empty()) {
|
||||||
Alloca = dyn_cast_or_null<AllocaInst>(
|
Alloca = dyn_cast_or_null<AllocaInst>(
|
||||||
F.getValueSymbolTable().lookup(Name.Value));
|
F.getValueSymbolTable()->lookup(Name.Value));
|
||||||
if (!Alloca)
|
if (!Alloca)
|
||||||
return error(Name.SourceRange.Start,
|
return error(Name.SourceRange.Start,
|
||||||
"alloca instruction named '" + Name.Value +
|
"alloca instruction named '" + Name.Value +
|
||||||
|
|
|
@ -26,7 +26,7 @@ using namespace llvm;
|
||||||
|
|
||||||
ValueSymbolTable *BasicBlock::getValueSymbolTable() {
|
ValueSymbolTable *BasicBlock::getValueSymbolTable() {
|
||||||
if (Function *F = getParent())
|
if (Function *F = getParent())
|
||||||
return &F->getValueSymbolTable();
|
return F->getValueSymbolTable();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -258,7 +258,10 @@ Function::Function(FunctionType *Ty, LinkageTypes Linkage, const Twine &name,
|
||||||
assert(FunctionType::isValidReturnType(getReturnType()) &&
|
assert(FunctionType::isValidReturnType(getReturnType()) &&
|
||||||
"invalid return type");
|
"invalid return type");
|
||||||
setGlobalObjectSubClassData(0);
|
setGlobalObjectSubClassData(0);
|
||||||
SymTab = new ValueSymbolTable();
|
|
||||||
|
// We only need a symbol table for a function if the context keeps value names
|
||||||
|
if (!getContext().shouldDiscardValueNames())
|
||||||
|
SymTab = make_unique<ValueSymbolTable>();
|
||||||
|
|
||||||
// If the function has arguments, mark them as lazily built.
|
// If the function has arguments, mark them as lazily built.
|
||||||
if (Ty->getNumParams())
|
if (Ty->getNumParams())
|
||||||
|
@ -279,7 +282,6 @@ Function::~Function() {
|
||||||
|
|
||||||
// Delete all of the method arguments and unlink from symbol table...
|
// Delete all of the method arguments and unlink from symbol table...
|
||||||
ArgumentList.clear();
|
ArgumentList.clear();
|
||||||
delete SymTab;
|
|
||||||
|
|
||||||
// Remove the function from the on-the-side GC table.
|
// Remove the function from the on-the-side GC table.
|
||||||
clearGC();
|
clearGC();
|
||||||
|
|
|
@ -143,16 +143,16 @@ static bool getSymTab(Value *V, ValueSymbolTable *&ST) {
|
||||||
if (Instruction *I = dyn_cast<Instruction>(V)) {
|
if (Instruction *I = dyn_cast<Instruction>(V)) {
|
||||||
if (BasicBlock *P = I->getParent())
|
if (BasicBlock *P = I->getParent())
|
||||||
if (Function *PP = P->getParent())
|
if (Function *PP = P->getParent())
|
||||||
ST = &PP->getValueSymbolTable();
|
ST = PP->getValueSymbolTable();
|
||||||
} else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
|
} else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
|
||||||
if (Function *P = BB->getParent())
|
if (Function *P = BB->getParent())
|
||||||
ST = &P->getValueSymbolTable();
|
ST = P->getValueSymbolTable();
|
||||||
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
|
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
|
||||||
if (Module *P = GV->getParent())
|
if (Module *P = GV->getParent())
|
||||||
ST = &P->getValueSymbolTable();
|
ST = &P->getValueSymbolTable();
|
||||||
} else if (Argument *A = dyn_cast<Argument>(V)) {
|
} else if (Argument *A = dyn_cast<Argument>(V)) {
|
||||||
if (Function *P = A->getParent())
|
if (Function *P = A->getParent())
|
||||||
ST = &P->getValueSymbolTable();
|
ST = P->getValueSymbolTable();
|
||||||
} else {
|
} else {
|
||||||
assert(isa<Constant>(V) && "Unknown value type!");
|
assert(isa<Constant>(V) && "Unknown value type!");
|
||||||
return true; // no name is setable for this.
|
return true; // no name is setable for this.
|
||||||
|
|
|
@ -219,7 +219,8 @@ static bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
|
||||||
if (I.hasLocalLinkage() && llvmUsedValues.count(&I) == 0)
|
if (I.hasLocalLinkage() && llvmUsedValues.count(&I) == 0)
|
||||||
if (!PreserveDbgInfo || !I.getName().startswith("llvm.dbg"))
|
if (!PreserveDbgInfo || !I.getName().startswith("llvm.dbg"))
|
||||||
I.setName(""); // Internal symbols can't participate in linkage
|
I.setName(""); // Internal symbols can't participate in linkage
|
||||||
StripSymtab(I.getValueSymbolTable(), PreserveDbgInfo);
|
if (auto *Symtab = I.getValueSymbolTable())
|
||||||
|
StripSymtab(*Symtab, PreserveDbgInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove all names from types.
|
// Remove all names from types.
|
||||||
|
|
|
@ -461,8 +461,7 @@ bool ReduceCrashingBlocks::TestBlocks(std::vector<const BasicBlock *> &BBs) {
|
||||||
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
||||||
for (unsigned i = 0, e = BlockInfo.size(); i != e; ++i) {
|
for (unsigned i = 0, e = BlockInfo.size(); i != e; ++i) {
|
||||||
Function *F = cast<Function>(GST.lookup(BlockInfo[i].first));
|
Function *F = cast<Function>(GST.lookup(BlockInfo[i].first));
|
||||||
ValueSymbolTable &ST = F->getValueSymbolTable();
|
Value *V = F->getValueSymbolTable()->lookup(BlockInfo[i].second);
|
||||||
Value *V = ST.lookup(BlockInfo[i].second);
|
|
||||||
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
||||||
BBs.push_back(cast<BasicBlock>(V));
|
BBs.push_back(cast<BasicBlock>(V));
|
||||||
}
|
}
|
||||||
|
@ -572,8 +571,7 @@ bool ReduceCrashingConditionals::TestBlocks(
|
||||||
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
||||||
for (auto &BI : BlockInfo) {
|
for (auto &BI : BlockInfo) {
|
||||||
auto *F = cast<Function>(GST.lookup(BI.first));
|
auto *F = cast<Function>(GST.lookup(BI.first));
|
||||||
ValueSymbolTable &ST = F->getValueSymbolTable();
|
Value *V = F->getValueSymbolTable()->lookup(BI.second);
|
||||||
Value *V = ST.lookup(BI.second);
|
|
||||||
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
||||||
BBs.push_back(cast<BasicBlock>(V));
|
BBs.push_back(cast<BasicBlock>(V));
|
||||||
}
|
}
|
||||||
|
@ -666,8 +664,7 @@ bool ReduceSimplifyCFG::TestBlocks(std::vector<const BasicBlock *> &BBs) {
|
||||||
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
const ValueSymbolTable &GST = M->getValueSymbolTable();
|
||||||
for (auto &BI : BlockInfo) {
|
for (auto &BI : BlockInfo) {
|
||||||
auto *F = cast<Function>(GST.lookup(BI.first));
|
auto *F = cast<Function>(GST.lookup(BI.first));
|
||||||
ValueSymbolTable &ST = F->getValueSymbolTable();
|
Value *V = F->getValueSymbolTable()->lookup(BI.second);
|
||||||
Value *V = ST.lookup(BI.second);
|
|
||||||
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
if (V && V->getType() == Type::getLabelTy(V->getContext()))
|
||||||
BBs.push_back(cast<BasicBlock>(V));
|
BBs.push_back(cast<BasicBlock>(V));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue