summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2018-02-06 22:17:45 +0000
committerAdrian Prantl <aprantl@apple.com>2018-02-06 22:17:45 +0000
commitc929f7ad423e9566dc9a06815d0f3f7f3d809db8 (patch)
tree705d15b04e8d0bf202bc035d8c981fa4eb0d6e56 /llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp
parent0ccef9ee1693f774a9dc23a10e0d3d7bf8b9bfbf (diff)
downloadbcm5719-llvm-c929f7ad423e9566dc9a06815d0f3f7f3d809db8.tar.gz
bcm5719-llvm-c929f7ad423e9566dc9a06815d0f3f7f3d809db8.zip
Fix a crash when emitting DIEs for variable-length arrays
VLAs may refer to a previous DIE to express the DW_AT_count of their type. Clang generates an artificial "vla_expr" variable for this. If this DIE hasn't been created yet LLVM asserts. This patch fixes this by sorting the local variables so that dependencies come before they are needed. It also replaces the linear scan in DWARFFile with a std::map, which can be faster. Differential Revision: https://reviews.llvm.org/D42940 llvm-svn: 324412
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp39
1 files changed, 10 insertions, 29 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp
index 87f39167c85..19a1dc3c66e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp
@@ -103,37 +103,18 @@ void DwarfFile::emitStrings(MCSection *StrSection, MCSection *OffsetSection,
}
bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
- SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
+ auto &ScopeVars = ScopeVariables[LS];
const DILocalVariable *DV = Var->getVariable();
- // Variables with positive arg numbers are parameters.
if (unsigned ArgNum = DV->getArg()) {
- // Keep all parameters in order at the start of the variable list to ensure
- // function types are correct (no out-of-order parameters)
- //
- // This could be improved by only doing it for optimized builds (unoptimized
- // builds have the right order to begin with), searching from the back (this
- // would catch the unoptimized case quickly), or doing a binary search
- // rather than linear search.
- auto I = Vars.begin();
- while (I != Vars.end()) {
- unsigned CurNum = (*I)->getVariable()->getArg();
- // A local (non-parameter) variable has been found, insert immediately
- // before it.
- if (CurNum == 0)
- break;
- // A later indexed parameter has been found, insert immediately before it.
- if (CurNum > ArgNum)
- break;
- if (CurNum == ArgNum) {
- (*I)->addMMIEntry(*Var);
- return false;
- }
- ++I;
+ auto Cached = ScopeVars.Args.find(ArgNum);
+ if (Cached == ScopeVars.Args.end())
+ ScopeVars.Args[ArgNum] = Var;
+ else {
+ Cached->second->addMMIEntry(*Var);
+ return false;
}
- Vars.insert(I, Var);
- return true;
- }
-
- Vars.push_back(Var);
+ } else {
+ ScopeVars.Locals.push_back(Var);
+ }
return true;
}
OpenPOWER on IntegriCloud