Index: include/llvm/Support/Dwarf.h =================================================================== --- include/llvm/Support/Dwarf.h +++ include/llvm/Support/Dwarf.h @@ -21,6 +21,8 @@ namespace llvm { +class Module; + //===----------------------------------------------------------------------===// // Debug info constants. @@ -951,6 +953,9 @@ }; }; +/// Return Dwarf Version by checking module flags. +unsigned getDwarfVersionFromModule(const Module *M); + } // End of namespace dwarf } // End of namespace llvm Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -168,14 +168,6 @@ } // end llvm namespace -/// Return Dwarf Version by checking module flags. -static unsigned getDwarfVersionFromModule(const Module *M) { - Value *Val = M->getModuleFlag("Dwarf Version"); - if (!Val) - return dwarf::DWARF_VERSION; - return cast(Val)->getZExtValue(); -} - DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) : Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator), @@ -211,7 +203,7 @@ DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber - : getDwarfVersionFromModule(MMI->getModule()); + : dwarf::getDwarfVersionFromModule(MMI->getModule()); { NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); Index: lib/Support/Dwarf.cpp =================================================================== --- lib/Support/Dwarf.cpp +++ lib/Support/Dwarf.cpp @@ -13,6 +13,8 @@ #include "llvm/Support/Dwarf.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Constants.h" using namespace llvm; using namespace dwarf; @@ -795,3 +797,10 @@ } llvm_unreachable("Unknown GDBIndexEntryLinkage value"); } + +unsigned getDwarfVersionFromModule(const Module *M) { + Value *Val = M->getModuleFlag("Dwarf Version"); + if (!Val) + return llvm::dwarf::DWARF_VERSION; + return cast(Val)->getZExtValue(); +} Index: lib/Transforms/Utils/AddDiscriminators.cpp =================================================================== --- lib/Transforms/Utils/AddDiscriminators.cpp +++ lib/Transforms/Utils/AddDiscriminators.cpp @@ -65,6 +65,7 @@ #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Dwarf.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -157,7 +158,12 @@ // No need to do anything if there is no debug info for this function. // If the function has debug information, but the user has disabled // discriminators, do nothing. - if (!hasDebugInfo(F) || NoDiscriminators) return false; + // Finally, if this module is built with dwarf versions earlier than 4, + // do nothing (discriminator support is a DWARF 4 feature). + if (!hasDebugInfo(F) || + dwarf::getDwarfVersionFromModule(F.getParent()) < 4 || + NoDiscriminators) + return false; bool Changed = false; Module *M = F.getParent();