[Core] Add flag to check if RoundTripPasses need to be run.

This would allow other flavor specific contexts to override the default value,
if they want to optionally run the round trip passes.

There is some information lost like the original file owner of the atom with
RoundTripPasses. The Gnu flavor needs this information inorder to implement
LinkerScript matching and for other diagnostic outputs such as Map files.

The flag also can be used to record information in the Atom if the information
to the Writer needs to be conveyed through References too.

llvm-svn: 222983
This commit is contained in:
Shankar Easwaran 2014-12-01 01:04:11 +00:00
parent a0184368d6
commit 2895527ec2
3 changed files with 32 additions and 4 deletions

View File

@ -318,8 +318,15 @@ public:
/// Return the next ordinal and Increment it.
virtual uint64_t getNextOrdinalAndIncrement() const { return _nextOrdinal++; }
/// @}
#ifndef NDEBUG
void setRunRoundTripPass(bool roundTripPass) {
_runRoundTripPasses = roundTripPass;
}
bool runRoundTripPass() const { return _runRoundTripPasses; }
#endif
/// @}
protected:
LinkingContext(); // Must be subclassed
@ -350,6 +357,9 @@ protected:
bool _allowRemainingUndefines;
bool _logInputFiles;
bool _allowShlibUndefines;
#ifndef NDEBUG
bool _runRoundTripPasses;
#endif
OutputFileType _outputFileType;
std::vector<StringRef> _deadStripRoots;
std::map<std::string, std::string> _aliasSymbols;

View File

@ -13,9 +13,28 @@
#include "lld/Core/Simple.h"
#include "lld/ReaderWriter/Writer.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/Process.h"
namespace lld {
#ifndef NDEBUG
LinkingContext::LinkingContext()
: _deadStrip(false), _allowDuplicates(false),
_globalsAreDeadStripRoots(false),
_searchArchivesToOverrideTentativeDefinitions(false),
_searchSharedLibrariesToOverrideTentativeDefinitions(false),
_warnIfCoalesableAtomsHaveDifferentCanBeNull(false),
_warnIfCoalesableAtomsHaveDifferentLoadName(false),
_printRemainingUndefines(true), _allowRemainingUndefines(false),
_logInputFiles(false), _allowShlibUndefines(false),
_runRoundTripPasses(false), _outputFileType(OutputFileType::Default),
_nextOrdinal(0) {
llvm::Optional<std::string> env =
llvm::sys::Process::GetEnv("LLD_RUN_ROUNDTRIP_TEST");
if (env.hasValue() && !env.getValue().empty())
setRunRoundTripPass(true);
}
#else
LinkingContext::LinkingContext()
: _deadStrip(false), _allowDuplicates(false),
_globalsAreDeadStripRoots(false),
@ -26,6 +45,7 @@ LinkingContext::LinkingContext()
_printRemainingUndefines(true), _allowRemainingUndefines(false),
_logInputFiles(false), _allowShlibUndefines(false),
_outputFileType(OutputFileType::Default), _nextOrdinal(0) {}
#endif
LinkingContext::~LinkingContext() {}

View File

@ -23,7 +23,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/raw_ostream.h"
#include <mutex>
@ -114,8 +113,7 @@ bool Driver::link(LinkingContext &context, raw_ostream &diagnostics) {
context.addPasses(pm);
#ifndef NDEBUG
llvm::Optional<std::string> env = llvm::sys::Process::GetEnv("LLD_RUN_ROUNDTRIP_TEST");
if (env.hasValue() && !env.getValue().empty()) {
if (context.runRoundTripPass()) {
pm.add(std::unique_ptr<Pass>(new RoundTripYAMLPass(context)));
pm.add(std::unique_ptr<Pass>(new RoundTripNativePass(context)));
}