Remove YAML/Native round-trip passes.

The round-trip passes were introduced in r193300. The intention of
the change was to make sure that LLD is capable of reading end
writing such file formats.

But that turned out to be yet another over-designed stuff that had
been slowing down everyday development.

The passes ran after the core linker and before the writer. If you
had an additional piece of information that needs to be passed from
front-end to the writer, you had to invent a way to save the data to
YAML/Native. These passes forced us to do that even if that data
was not needed to be represented neither in an object file nor in
an executable/DSO. It doesn't make sense. We don't need these passes.

http://reviews.llvm.org/D7480

llvm-svn: 230069
This commit is contained in:
Rui Ueyama 2015-02-20 22:10:28 +00:00
parent 860660ea5e
commit 2c64aef35f
22 changed files with 3 additions and 247 deletions

View File

@ -1,39 +0,0 @@
//===--Passes/RoundTripNativePass.h - Write Native file/Read it back------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLD_PASSES_ROUND_TRIP_NATIVE_PASS_H
#define LLD_PASSES_ROUND_TRIP_NATIVE_PASS_H
#include "lld/Core/File.h"
#include "lld/Core/LinkingContext.h"
#include "lld/Core/Pass.h"
#include <vector>
namespace lld {
class RoundTripNativePass : public Pass {
public:
RoundTripNativePass(LinkingContext &context) : Pass(), _context(context) {}
/// Writes to a native file and reads the atoms from the native file back.
/// Replaces mergedFile with the contents of the native File.
void perform(std::unique_ptr<MutableFile> &mergedFile) override;
virtual ~RoundTripNativePass() {}
private:
LinkingContext &_context;
// Keep the parsed file alive for the rest of the link. All atoms
// that are created by the RoundTripNativePass are owned by the
// nativeFile.
std::vector<std::unique_ptr<File> > _nativeFile;
};
} // namespace lld
#endif // LLD_PASSES_ROUND_TRIP_NATIVE_PASS_H

View File

@ -1,39 +0,0 @@
//===--Passes/RoundTripYAMLPass.h- Write YAML file/Read it back-----------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLD_PASSES_ROUND_TRIP_YAML_PASS_H
#define LLD_PASSES_ROUND_TRIP_YAML_PASS_H
#include "lld/Core/File.h"
#include "lld/Core/LinkingContext.h"
#include "lld/Core/Pass.h"
#include <vector>
namespace lld {
class RoundTripYAMLPass : public Pass {
public:
RoundTripYAMLPass(LinkingContext &context) : Pass(), _context(context) {}
/// Writes to a YAML file and reads the atoms from the YAML file back.
/// Replaces the mergedFile with new contents.
void perform(std::unique_ptr<MutableFile> &mergedFile) override;
virtual ~RoundTripYAMLPass() {}
private:
LinkingContext &_context;
// Keep the parsed file alive for the rest of the link. All atoms
// that are created by the RoundTripYAMLPass are owned by the
// yamlFile.
std::vector<std::unique_ptr<File> > _yamlFile;
};
} // namespace lld
#endif // LLD_PASSES_ROUND_TRIP_YAML_PASS_H

View File

@ -1,5 +1,4 @@
add_subdirectory(Config)
add_subdirectory(Core)
add_subdirectory(Driver)
add_subdirectory(Passes)
add_subdirectory(ReaderWriter)

View File

@ -20,7 +20,6 @@ add_llvm_library(lldDriver
WinLinkModuleDef.cpp
LINK_LIBS
lldConfig
lldPasses
lldMachO
lldPECOFF
lldELF

View File

@ -17,8 +17,6 @@
#include "lld/Core/Resolver.h"
#include "lld/Core/Writer.h"
#include "lld/Driver/Driver.h"
#include "lld/Passes/RoundTripNativePass.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/Arg.h"
@ -116,17 +114,6 @@ bool Driver::link(LinkingContext &context, raw_ostream &diagnostics) {
ScopedTask passTask(getDefaultDomain(), "Passes");
PassManager pm;
context.addPasses(pm);
#ifndef NDEBUG
llvm::Optional<std::string> env =
llvm::sys::Process::GetEnv("LLD_RUN_ROUNDTRIP_TEST");
if (env.hasValue() && !env.getValue().empty()) {
pm.add(llvm::make_unique<RoundTripYAMLPass>(context));
pm.add(llvm::make_unique<RoundTripNativePass>(context));
}
#endif
pm.runOnFile(merged);
passTask.end();

View File

@ -1,9 +0,0 @@
add_llvm_library(lldPasses
RoundTripNativePass.cpp
RoundTripYAMLPass.cpp
LINK_LIBS
lldCore
lldNative
lldYAML
LLVMSupport
)

View File

@ -1,13 +0,0 @@
##===- lld/lib/Passes/Makefile ---------------------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
LLD_LEVEL := ../..
LIBRARYNAME := lldPasses
include $(LLD_LEVEL)/Makefile

View File

@ -1,53 +0,0 @@
//===--Passes/RoundTripNativePass.cpp - Write Native file/Read it back-----===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lld/Core/Instrumentation.h"
#include "lld/Core/Simple.h"
#include "lld/Core/Writer.h"
#include "lld/Passes/RoundTripNativePass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Path.h"
#include <memory>
using namespace lld;
#define DEBUG_TYPE "RoundTripNativePass"
/// Perform the actual pass
void RoundTripNativePass::perform(std::unique_ptr<MutableFile> &mergedFile) {
ScopedTask task(getDefaultDomain(), "RoundTripNativePass");
std::unique_ptr<Writer> nativeWriter = createWriterNative();
SmallString<128> tmpNativeFile;
// Separate the directory from the filename
StringRef outFile = llvm::sys::path::filename(_context.outputPath());
if (llvm::sys::fs::createTemporaryFile(outFile, "native", tmpNativeFile))
return;
DEBUG(llvm::dbgs() << "RoundTripNativePass: " << tmpNativeFile << "\n");
// The file that is written would be kept around if there is a problem
// writing to the file or when reading atoms back from the file.
nativeWriter->writeFile(*mergedFile, tmpNativeFile.str());
ErrorOr<std::unique_ptr<MemoryBuffer>> mb =
MemoryBuffer::getFile(tmpNativeFile.str());
if (!mb)
return;
std::error_code ec = _context.registry().loadFile(
std::move(mb.get()), _nativeFile);
if (ec) {
// Note: we need a way for Passes to report errors.
llvm_unreachable("native reader not registered or read error");
}
File *objFile = _nativeFile[0].get();
if (objFile->parse())
llvm_unreachable("native reader parse error");
mergedFile.reset(new SimpleFile(objFile->path()));
copyAtoms(mergedFile.get(), objFile);
llvm::sys::fs::remove(tmpNativeFile.str());
}

View File

@ -1,53 +0,0 @@
//===--Passes/RoundTripYAMLPass.cpp - Write YAML file/Read it back---------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lld/Core/Instrumentation.h"
#include "lld/Core/Simple.h"
#include "lld/Core/Writer.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Path.h"
#include <memory>
using namespace lld;
#define DEBUG_TYPE "RoundTripYAMLPass"
/// Perform the actual pass
void RoundTripYAMLPass::perform(std::unique_ptr<MutableFile> &mergedFile) {
ScopedTask task(getDefaultDomain(), "RoundTripYAMLPass");
std::unique_ptr<Writer> yamlWriter = createWriterYAML(_context);
SmallString<128> tmpYAMLFile;
// Separate the directory from the filename
StringRef outFile = llvm::sys::path::filename(_context.outputPath());
if (llvm::sys::fs::createTemporaryFile(outFile, "yaml", tmpYAMLFile))
return;
DEBUG(llvm::dbgs() << "RoundTripYAMLPass: " << tmpYAMLFile << "\n");
// The file that is written would be kept around if there is a problem
// writing to the file or when reading atoms back from the file.
yamlWriter->writeFile(*mergedFile, tmpYAMLFile.str());
ErrorOr<std::unique_ptr<MemoryBuffer>> mb =
MemoryBuffer::getFile(tmpYAMLFile.str());
if (!mb)
return;
std::error_code ec = _context.registry().loadFile(
std::move(mb.get()), _yamlFile);
if (ec) {
// Note: we need a way for Passes to report errors.
llvm_unreachable("yaml reader not registered or read error");
}
File *objFile = _yamlFile[0].get();
if (objFile->parse())
llvm_unreachable("native reader parse error");
mergedFile.reset(new SimpleFile(objFile->path()));
copyAtoms(mergedFile.get(), objFile);
llvm::sys::fs::remove(tmpYAMLFile.str());
}

View File

@ -14,7 +14,6 @@ add_llvm_library(lldReaderWriter
LinkerScript.cpp
LINK_LIBS
lldCore
lldPasses
lldYAML
LLVMObject
LLVMSupport

View File

@ -12,7 +12,6 @@
#include "lld/Core/Pass.h"
#include "lld/Core/PassManager.h"
#include "lld/Core/Simple.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "lld/ReaderWriter/CoreLinkingContext.h"
#include "llvm/ADT/ArrayRef.h"

View File

@ -4,7 +4,6 @@ add_llvm_library(lldELF
Writer.cpp
LINK_LIBS
lldCore
lldPasses
lldYAML
LLVMSupport
)

View File

@ -13,7 +13,6 @@
#include "TargetHandler.h"
#include "lld/Core/Instrumentation.h"
#include "lld/Core/SharedLibraryFile.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Config/config.h"
#include "llvm/Support/ELF.h"

View File

@ -9,7 +9,6 @@
LLD_LEVEL := ../../..
LIBRARYNAME := lldELF
USEDLIBS = lldPasses.a
CPP.Flags += -I$(PROJ_SRC_DIR)/$(LLD_LEVEL)/lib/ReaderWriter/ELF

View File

@ -18,7 +18,6 @@ add_llvm_library(lldMachO
WriterMachO.cpp
LINK_LIBS
lldCore
lldPasses
lldYAML
LLVMObject
LLVMSupport

View File

@ -17,7 +17,6 @@
#include "lld/Core/Reader.h"
#include "lld/Core/Writer.h"
#include "lld/Driver/Driver.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Config/config.h"

View File

@ -11,7 +11,6 @@ add_llvm_library(lldPECOFF
WriterPECOFF.cpp
LINK_LIBS
lldCore
lldPasses
LLVMObject
LLVMSupport
)

View File

@ -1,8 +1,7 @@
# Check that LLD shows an error if ADDIUPC immediate is out of range.
# RUN: yaml2obj -format=elf %s > %t-obj
# RUN: env LLD_RUN_ROUNDTRIP_TEST= \
# RUN: lld -flavor gnu -target mipsel -o %t-exe %t-obj 2>&1 | FileCheck %s
# RUN: lld -flavor gnu -target mipsel -o %t-exe %t-obj 2>&1 | FileCheck %s
# CHECK: The addiupc instruction immediate 0x02000008 is out of range

View File

@ -1,11 +0,0 @@
# This tests the functionality of the RoundTrip Passes and verifies
# that the atoms belong to the native file after the passes finish
# REQUIRES: asserts
RUN: lld -flavor gnu -target x86_64 %p/Inputs/foo.o.x86-64 --noinhibit-exec \
RUN: --output-filetype=yaml -o %t1
RUN: FileCheck %s < %t1
CHECK:path:{{.*}}.native

View File

@ -28,9 +28,6 @@ config.suffixes = ['.objtxt', '.test']
# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
# run RoundTrip{YAML,Native}Tests.
config.environment['LLD_RUN_ROUNDTRIP_TEST'] = '1'
# test_exec_root: The root path where tests should be run.
lld_obj_root = getattr(config, 'lld_obj_root', None)
if lld_obj_root is not None:

View File

@ -20,7 +20,7 @@ include $(LEVEL)/Makefile.config
LINK_COMPONENTS := $(TARGETS_TO_BUILD)
USEDLIBS = lldDriver.a lldConfig.a \
lldELF.a lldMachO.a lldPasses.a lldPECOFF.a lldYAML.a \
lldELF.a lldMachO.a lldPECOFF.a lldYAML.a \
lldReaderWriter.a lldCore.a lldNative.a \
lldHexagonELFTarget.a lldMipsELFTarget.a \
lldX86ELFTarget.a lldX86_64ELFTarget.a lldAArch64ELFTarget.a \

View File

@ -10,7 +10,7 @@
LLD_LEVEL = ../..
TESTNAME = DriverTests
USEDLIBS = lldDriver.a lldConfig.a \
lldELF.a lldMachO.a lldPasses.a lldPECOFF.a \
lldELF.a lldMachO.a lldPECOFF.a \
lldCore.a lldNative.a lldReaderWriter.a \
lldHexagonELFTarget.a lldMipsELFTarget.a \
lldX86ELFTarget.a lldX86_64ELFTarget.a lldYAML.a \