diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-27 17:29:58 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-27 17:29:58 +0000 |
commit | 3d2afaa29ea78b6170da9852ce5d57480720d1e0 (patch) | |
tree | 898d287e9f2cd9a4a0eb3081725093a0b4d2466d /llvm/lib/IR/DIBuilder.cpp | |
parent | b4499078d1b5e159d03cf51011ea71027716cfff (diff) | |
download | bcm5719-llvm-3d2afaa29ea78b6170da9852ce5d57480720d1e0.tar.gz bcm5719-llvm-3d2afaa29ea78b6170da9852ce5d57480720d1e0.zip |
Verifier: Check fields of MDVariable subclasses
Check fields from `MDLocalVariable` and `MDGlobalVariable` and change
the accessors to downcast to the right types. `getType()` still returns
`Metadata*` since it could be an `MDString`-based reference.
Since local variables require non-null scopes, I also updated `LLParser`
to require a `scope:` field.
A number of testcases had grown bitrot and started failing with this
patch; I committed them separately in r233349. If I just broke your
out-of-tree testcases, you're probably hitting similar problems (so have
a look there).
llvm-svn: 233389
Diffstat (limited to 'llvm/lib/IR/DIBuilder.cpp')
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 9677de47f7b..ec5ee7da5cb 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -582,9 +582,10 @@ DIGlobalVariable DIBuilder::createGlobalVariable( MDNode *Decl) { checkGlobalVariableScope(Context); - auto *N = MDGlobalVariable::get(VMContext, Context, Name, LinkageName, F, - LineNumber, Ty, isLocalToUnit, true, - getConstantOrNull(Val), Decl); + auto *N = MDGlobalVariable::get( + VMContext, cast_or_null<MDScope>(Context.get()), Name, LinkageName, F, + LineNumber, Ty, isLocalToUnit, true, getConstantOrNull(Val), + cast_or_null<MDDerivedType>(Decl)); AllGVs.push_back(N); return N; } @@ -595,9 +596,10 @@ DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl( MDNode *Decl) { checkGlobalVariableScope(Context); - return MDGlobalVariable::getTemporary(VMContext, Context, Name, LinkageName, - F, LineNumber, Ty, isLocalToUnit, false, - getConstantOrNull(Val), Decl).release(); + return MDGlobalVariable::getTemporary( + VMContext, cast_or_null<MDScope>(Context.get()), Name, LinkageName, + F, LineNumber, Ty, isLocalToUnit, false, getConstantOrNull(Val), + cast_or_null<MDDerivedType>(Decl)).release(); } DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, @@ -613,9 +615,9 @@ DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, assert((!Context || Context.isScope()) && "createLocalVariable should be called with a valid Context"); - auto *Node = - MDLocalVariable::get(VMContext, Tag, getNonCompileUnitScope(Scope), Name, - File, LineNo, Ty, ArgNo, Flags); + auto *Node = MDLocalVariable::get(VMContext, Tag, + cast_or_null<MDLocalScope>(Context.get()), + Name, File, LineNo, Ty, ArgNo, Flags); if (AlwaysPreserve) { // The optimizer may remove local variable. If there is an interest // to preserve variable info in such situation then stash it in a |