Skip to content

Commit

Permalink
Object: Add version and producer fields to the irsymtab header. NFCI.
Browse files Browse the repository at this point in the history
These will be necessary in order to handle upgrades from old bitcode
files.

Differential Revision: https://reviews.llvm.org/D33972

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306486 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
pcc committed Jun 27, 2017
1 parent dbbccba commit 0293dd1
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
12 changes: 12 additions & 0 deletions include/llvm/Object/IRSymtab.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,18 @@ struct Uncommon {
};

struct Header {
/// Version number of the symtab format. This number should be incremented
/// when the format changes, but it does not need to be incremented if a
/// change to LLVM would cause it to create a different symbol table.
Word Version;
enum { kCurrentVersion = 0 };

/// The producer's version string (LLVM_VERSION_STRING " " LLVM_REVISION).
/// Consumers should rebuild the symbol table from IR if the producer's
/// version does not match the consumer's version due to potential differences
/// in symbol table format, symbol enumeration order and so on.
Str Producer;

Range<Module> Modules;
Range<Comdat> Comdats;
Range<Symbol> Symbols;
Expand Down
18 changes: 18 additions & 0 deletions lib/Object/IRSymtab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "llvm/Support/Casting.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/StringSaver.h"
#include "llvm/Support/VCSRevision.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <string>
Expand All @@ -43,6 +44,21 @@ using namespace irsymtab;

namespace {

const char *getExpectedProducerName() {
static char DefaultName[] = LLVM_VERSION_STRING
#ifdef LLVM_REVISION
" " LLVM_REVISION
#endif
;
// Allows for testing of the irsymtab writer and upgrade mechanism. This
// environment variable should not be set by users.
if (char *OverrideName = getenv("LLVM_OVERRIDE_PRODUCER"))
return OverrideName;
return DefaultName;
}

const char *kExpectedProducerName = getExpectedProducerName();

/// Stores the temporary state that is required to build an IR symbol table.
struct Builder {
SmallVector<char, 0> &Symtab;
Expand Down Expand Up @@ -231,6 +247,8 @@ Error Builder::build(ArrayRef<Module *> IRMods) {
storage::Header Hdr;

assert(!IRMods.empty());
Hdr.Version = storage::Header::kCurrentVersion;
setStr(Hdr.Producer, kExpectedProducerName);
setStr(Hdr.TargetTriple, IRMods[0]->getTargetTriple());
setStr(Hdr.SourceFileName, IRMods[0]->getSourceFileName());
TT = Triple(IRMods[0]->getTargetTriple());
Expand Down

0 comments on commit 0293dd1

Please sign in to comment.