+++ /dev/null
-//===--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
+++ /dev/null
-//===--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
add_subdirectory(Config)
add_subdirectory(Core)
add_subdirectory(Driver)
-add_subdirectory(Passes)
add_subdirectory(ReaderWriter)
WinLinkModuleDef.cpp
LINK_LIBS
lldConfig
- lldPasses
lldMachO
lldPECOFF
lldELF
#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"
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();
+++ /dev/null
-add_llvm_library(lldPasses
- RoundTripNativePass.cpp
- RoundTripYAMLPass.cpp
- LINK_LIBS
- lldCore
- lldNative
- lldYAML
- LLVMSupport
- )
+++ /dev/null
-##===- 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
+++ /dev/null
-//===--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());
-}
+++ /dev/null
-//===--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());
-}
LinkerScript.cpp
LINK_LIBS
lldCore
- lldPasses
lldYAML
LLVMObject
LLVMSupport
#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"
Writer.cpp
LINK_LIBS
lldCore
- lldPasses
lldYAML
LLVMSupport
)
#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"
LLD_LEVEL := ../../..
LIBRARYNAME := lldELF
-USEDLIBS = lldPasses.a
CPP.Flags += -I$(PROJ_SRC_DIR)/$(LLD_LEVEL)/lib/ReaderWriter/ELF
WriterMachO.cpp
LINK_LIBS
lldCore
- lldPasses
lldYAML
LLVMObject
LLVMSupport
#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"
WriterPECOFF.cpp
LINK_LIBS
lldCore
- lldPasses
LLVMObject
LLVMSupport
)
# 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
+++ /dev/null
-# 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
-
# 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:
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 \
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 \