Files
clang-p2996/lld/utils/linker-script-test/linker-script-test.cpp
Rafael Auler ee95c3b5c5 Make ELFLinkingContext own LinkerScript buffers
Currently, no one owns script::Parser buffers, but yet ELFLinkingContext gets
updated with StringRef pointers to data inside Parser buffers. Since this buffer
is locally owned inside GnuLdDriver::evalLinkerScript(), as soon as this
function finishes, all pointers in ELFLinkingContext that comes from linker
scripts get invalid. The problem is that we need someone to own linker scripts
data structures and, since ELFLinkingContext transports references to linker
scripts data, we can simply make it also own all linker scripts data.

Differential Revision: http://reviews.llvm.org/D7323

llvm-svn: 227975
2015-02-03 16:08:57 +00:00

58 lines
1.5 KiB
C++

//===- utils/linker-script-test/linker-script-test.cpp --------------------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Tool for testing linker script parsing.
///
//===----------------------------------------------------------------------===//
#include "lld/ReaderWriter/LinkerScript.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Signals.h"
using namespace llvm;
using namespace lld;
using namespace script;
int main(int argc, const char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal();
llvm::PrettyStackTraceProgram X(argc, argv);
{
ErrorOr<std::unique_ptr<MemoryBuffer>> mb =
MemoryBuffer::getFileOrSTDIN(argv[1]);
if (std::error_code ec = mb.getError()) {
llvm::errs() << ec.message() << "\n";
return 1;
}
Lexer l(std::move(mb.get()));
Token tok;
while (true) {
l.lex(tok);
tok.dump(llvm::outs());
if (tok._kind == Token::eof || tok._kind == Token::unknown)
break;
}
}
{
ErrorOr<std::unique_ptr<MemoryBuffer>> mb =
MemoryBuffer::getFileOrSTDIN(argv[1]);
if (std::error_code ec = mb.getError()) {
llvm::errs() << ec.message() << "\n";
return 1;
}
Parser p(std::move(mb.get()));
if (!p.parse()) {
LinkerScript *ls = p.get();
ls->dump(llvm::outs());
}
}
}