diff options
author | Manman Ren <manman.ren@gmail.com> | 2013-12-02 21:29:56 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2013-12-02 21:29:56 +0000 |
commit | 8b4306ce050bd58d8457e16fbbc26dafde7cd181 (patch) | |
tree | 963eefcbb7683b2d3e5590bde5e610854d418377 /llvm/lib/IR/Module.cpp | |
parent | e601b504b62cabdec1bca2f21edccb1722ef877e (diff) | |
download | llvm-8b4306ce050bd58d8457e16fbbc26dafde7cd181.zip llvm-8b4306ce050bd58d8457e16fbbc26dafde7cd181.tar.gz llvm-8b4306ce050bd58d8457e16fbbc26dafde7cd181.tar.bz2 |
Debug Info: drop debug info via upgrading path if version number does not match.
Add a helper function getDebugInfoVersionFromModule to return the debug info
version number for a module.
"Verifier/module-flags-1.ll" checks for verification errors.
It will seg fault when calling getDebugInfoVersionFromModule because of the
incorrect format for module flags in the testing case. We make
getModuleFlagsMetadata more robust by checking for error conditions.
PR17982
llvm-svn: 196158
Diffstat (limited to 'llvm/lib/IR/Module.cpp')
-rw-r--r-- | llvm/lib/IR/Module.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index 3dd1f7e..4f240c7 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -318,11 +318,16 @@ getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const { for (unsigned i = 0, e = ModFlags->getNumOperands(); i != e; ++i) { MDNode *Flag = ModFlags->getOperand(i); - ConstantInt *Behavior = cast<ConstantInt>(Flag->getOperand(0)); - MDString *Key = cast<MDString>(Flag->getOperand(1)); - Value *Val = Flag->getOperand(2); - Flags.push_back(ModuleFlagEntry(ModFlagBehavior(Behavior->getZExtValue()), - Key, Val)); + if (Flag->getNumOperands() >= 3 && isa<ConstantInt>(Flag->getOperand(0)) && + isa<MDString>(Flag->getOperand(1))) { + // Check the operands of the MDNode before accessing the operands. + // The verifier will actually catch these failures. + ConstantInt *Behavior = cast<ConstantInt>(Flag->getOperand(0)); + MDString *Key = cast<MDString>(Flag->getOperand(1)); + Value *Val = Flag->getOperand(2); + Flags.push_back(ModuleFlagEntry(ModFlagBehavior(Behavior->getZExtValue()), + Key, Val)); + } } } |