diff --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/lib/Object/IRSymtab.cpp @@ -14,6 +14,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/Config/llvm-config.h" #include "llvm/IR/Comdat.h" #include "llvm/IR/DataLayout.h" @@ -22,13 +23,13 @@ #include "llvm/IR/Mangler.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" -#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/MC/StringTableBuilder.h" #include "llvm/Object/IRObjectFile.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/StringSaver.h" #include "llvm/Support/VCSRevision.h" @@ -41,6 +42,10 @@ using namespace llvm; using namespace irsymtab; +cl::opt DisableBitcodeVersionUpgrade( + "disable-bitcode-version-upgrade", cl::init(false), cl::Hidden, + cl::desc("Disable automatic bitcode upgrade for version mismatch")); + static const char *PreservedSymbols[] = { #define HANDLE_LIBCALL(code, name) name, #include "llvm/IR/RuntimeLibcalls.def" @@ -402,20 +407,22 @@ return make_error("Bitcode file does not contain any modules", inconvertibleErrorCode()); - if (BFC.StrtabForSymtab.empty() || - BFC.Symtab.size() < sizeof(storage::Header)) - return upgrade(BFC.Mods); - - // We cannot use the regular reader to read the version and producer, because - // it will expect the header to be in the current format. The only thing we - // can rely on is that the version and producer will be present as the first - // struct elements. - auto *Hdr = reinterpret_cast(BFC.Symtab.data()); - unsigned Version = Hdr->Version; - StringRef Producer = Hdr->Producer.get(BFC.StrtabForSymtab); - if (Version != storage::Header::kCurrentVersion || - Producer != kExpectedProducerName) - return upgrade(BFC.Mods); + if (!DisableBitcodeVersionUpgrade) { + if (BFC.StrtabForSymtab.empty() || + BFC.Symtab.size() < sizeof(storage::Header)) + return upgrade(BFC.Mods); + + // We cannot use the regular reader to read the version and producer, + // because it will expect the header to be in the current format. The only + // thing we can rely on is that the version and producer will be present as + // the first struct elements. + auto *Hdr = reinterpret_cast(BFC.Symtab.data()); + unsigned Version = Hdr->Version; + StringRef Producer = Hdr->Producer.get(BFC.StrtabForSymtab); + if (Version != storage::Header::kCurrentVersion || + Producer != kExpectedProducerName) + return upgrade(BFC.Mods); + } FileContents FC; FC.TheReader = {{BFC.Symtab.data(), BFC.Symtab.size()},