[llvm] r196158 - Debug Info: drop debug info via upgrading path if version number does not match.

Eric Christopher echristo at gmail.com
Mon Dec 2 14:07:36 PST 2013


> Add a helper function getDebugInfoVersionFromModule to return the debug info
> version number for a module.
>

I think this should be getDebugMetadataVersionFromModule since this
could be easily confused with the dwarf version that someone has asked
for.

-eric

> "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.
>

I'm not sure what's going on here, can you elaborate?

-eric


> PR17982
>
> Added:
>     llvm/trunk/test/Bitcode/drop-debug-info.ll
> Modified:
>     llvm/trunk/include/llvm/AutoUpgrade.h
>     llvm/trunk/include/llvm/DebugInfo.h
>     llvm/trunk/lib/AsmParser/LLParser.cpp
>     llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>     llvm/trunk/lib/IR/AutoUpgrade.cpp
>     llvm/trunk/lib/IR/DebugInfo.cpp
>     llvm/trunk/lib/IR/Module.cpp
>
> Modified: llvm/trunk/include/llvm/AutoUpgrade.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/AutoUpgrade.h?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/AutoUpgrade.h (original)
> +++ llvm/trunk/include/llvm/AutoUpgrade.h Mon Dec  2 15:29:56 2013
> @@ -57,6 +57,10 @@ namespace llvm {
>    /// with different address spaces: the instruction is replaced by a pair
>    /// ptrtoint+inttoptr.
>    Value *UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy);
> +
> +  /// Check the debug info version number, if it is out-dated, drop the debug
> +  /// info. Return true if module is modified.
> +  bool UpgradeDebugInfo(Module &M);
>  } // End llvm namespace
>
>  #endif
>
> Modified: llvm/trunk/include/llvm/DebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo.h?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo.h Mon Dec  2 15:29:56 2013
> @@ -759,6 +759,9 @@ DITypeIdentifierMap generateDITypeIdenti
>  /// Return true if module is modified.
>  bool StripDebugInfo(Module &M);
>
> +/// Return Debug Info Version by checking module flags.
> +unsigned getDebugInfoVersionFromModule(const Module &M);
> +
>  /// DebugInfoFinder tries to list all debug info MDNodes used in a module. To
>  /// list debug info MDNodes used by an instruction, DebugInfoFinder uses
>  /// processDeclare, processValue and processLocation to handle DbgDeclareInst,
>
> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Mon Dec  2 15:29:56 2013
> @@ -182,6 +182,8 @@ bool LLParser::ValidateEndOfModule() {
>    for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; )
>      UpgradeCallsToIntrinsic(FI++); // must be post-increment, as we remove
>
> +  UpgradeDebugInfo(*M);
> +
>    return false;
>  }
>
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Mon Dec  2 15:29:56 2013
> @@ -3152,6 +3152,7 @@ error_code BitcodeReader::MaterializeMod
>    for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++)
>      UpgradeInstWithTBAATag(InstsWithTBAATag[I]);
>
> +  UpgradeDebugInfo(*M);
>    return error_code::success();
>  }
>
>
> Modified: llvm/trunk/lib/IR/AutoUpgrade.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AutoUpgrade.cpp?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/AutoUpgrade.cpp (original)
> +++ llvm/trunk/lib/IR/AutoUpgrade.cpp Mon Dec  2 15:29:56 2013
> @@ -12,6 +12,7 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "llvm/AutoUpgrade.h"
> +#include "llvm/DebugInfo.h"
>  #include "llvm/IR/Constants.h"
>  #include "llvm/IR/Function.h"
>  #include "llvm/IR/IRBuilder.h"
> @@ -489,3 +490,12 @@ Value *llvm::UpgradeBitCastExpr(unsigned
>
>    return 0;
>  }
> +
> +/// Check the debug info version number, if it is out-dated, drop the debug
> +/// info. Return true if module is modified.
> +bool llvm::UpgradeDebugInfo(Module &M) {
> +  if (getDebugInfoVersionFromModule(M) == DEBUG_METADATA_VERSION)
> +    return false;
> +
> +  return StripDebugInfo(M);
> +}
>
> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
> +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Dec  2 15:29:56 2013
> @@ -1477,3 +1477,11 @@ bool llvm::StripDebugInfo(Module &M) {
>
>    return Changed;
>  }
> +
> +/// Return Debug Info Version by checking module flags.
> +unsigned llvm::getDebugInfoVersionFromModule(const Module &M) {
> +  Value *Val = M.getModuleFlag("Debug Info Version");
> +  if (!Val)
> +    return 0;
> +  return cast<ConstantInt>(Val)->getZExtValue();
> +}
>
> Modified: llvm/trunk/lib/IR/Module.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Module.cpp?rev=196158&r1=196157&r2=196158&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Module.cpp (original)
> +++ llvm/trunk/lib/IR/Module.cpp Mon Dec  2 15:29:56 2013
> @@ -318,11 +318,16 @@ getModuleFlagsMetadata(SmallVectorImpl<M
>
>    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));
> +    }
>    }
>  }
>
>
> Added: llvm/trunk/test/Bitcode/drop-debug-info.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/drop-debug-info.ll?rev=196158&view=auto
> ==============================================================================
> --- llvm/trunk/test/Bitcode/drop-debug-info.ll (added)
> +++ llvm/trunk/test/Bitcode/drop-debug-info.ll Mon Dec  2 15:29:56 2013
> @@ -0,0 +1,26 @@
> +; RUN: llvm-as < %s | llvm-dis | FileCheck %s
> +
> +define i32 @main() {
> +entry:
> +  %retval = alloca i32, align 4
> +  store i32 0, i32* %retval
> +  ret i32 0, !dbg !12
> +}
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!9}
> +
> +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 (trunk 195495) (llvm/trunk 195495:195504M)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/llvm_gmail/release/../llvm/tools/clang/test/CodeGen/debug-info-version.c] [DW_LANG_C99]
> +!1 = metadata !{metadata !"../llvm/tools/clang/test/CodeGen/debug-info-version.c", metadata !"/Users/manmanren/llvm_gmail/release"}
> +!2 = metadata !{i32 0}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [main]
> +!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type ] [/Users/manmanren/llvm_gmail/release/../llvm/tools/clang/test/CodeGen/debug-info-version.c]
> +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!7 = metadata !{metadata !8}
> +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
> +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
> +!12 = metadata !{i32 4, i32 0, metadata !4, null}
> +
> +; CHECK-NOT: !dbg
> +; CHECK-NOT: !llvm.dbg.cu
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list