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
58 lines
1.5 KiB
C++
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());
|
|
}
|
|
}
|
|
}
|