llvm-lto: Add testing coverage for local contexts

Add coverage in `llvm-lto` for the API exposed by libLTO to create
modules in local contexts.

The goal here isn't to test the symbol-related API extensively, just to
confirm that these modules work at all.  (I'll be shifting code around
soon that should be NFC and I realized there was no test coverage.)

llvm-svn: 224408
This commit is contained in:
Duncan P. N. Exon Smith 2014-12-17 02:00:38 +00:00
parent 52ee5e446b
commit f9abf4fb0c
3 changed files with 66 additions and 0 deletions

View File

@ -0,0 +1,4 @@
@glob = global i32 0
define void @bar() {
ret void
}

View File

@ -0,0 +1,15 @@
; RUN: llvm-as -o %T/1.bc %s
; RUN: llvm-as -o %T/2.bc %S/Inputs/list-symbols.ll
; RUN: llvm-lto -list-symbols-only %T/1.bc %T/2.bc | FileCheck %s
; CHECK-LABEL: 1.bc:
; CHECK-DAG: foo
; CHECK-DAG: glob
; CHECK-LABEL: 2.bc:
; CHECK-DAG: glob
; CHECK-DAG: bar
@glob = global i32 0
define void @foo() {
ret void
}

View File

@ -65,6 +65,10 @@ DSOSymbols("dso-symbol",
cl::desc("Symbol to put in the symtab in the resulting dso"),
cl::ZeroOrMore);
static cl::opt<bool> ListSymbolsOnly(
"list-symbols-only", cl::init(false),
cl::desc("Instead of running LTO, list the symbols in each IR file"));
namespace {
struct ModuleInfo {
std::vector<bool> CanBeHidden;
@ -90,6 +94,46 @@ void handleDiagnostics(lto_codegen_diagnostic_severity_t Severity,
errs() << Msg << "\n";
}
std::unique_ptr<LTOModule>
getLocalLTOModule(StringRef Path, std::unique_ptr<MemoryBuffer> &Buffer,
const TargetOptions &Options, std::string &Error) {
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
MemoryBuffer::getFile(Path);
if (std::error_code EC = BufferOrErr.getError()) {
Error = EC.message();
return nullptr;
}
Buffer = std::move(BufferOrErr.get());
return std::unique_ptr<LTOModule>(LTOModule::createInLocalContext(
Buffer->getBufferStart(), Buffer->getBufferSize(), Options, Error, Path));
}
/// \brief List symbols in each IR file.
///
/// The main point here is to provide lit-testable coverage for the LTOModule
/// functionality that's exposed by the C API to list symbols. Moreover, this
/// provides testing coverage for modules that have been created in their own
/// contexts.
int listSymbols(StringRef Command, const TargetOptions &Options) {
for (auto &Filename : InputFilenames) {
std::string Error;
std::unique_ptr<MemoryBuffer> Buffer;
std::unique_ptr<LTOModule> Module =
getLocalLTOModule(Filename, Buffer, Options, Error);
if (!Module) {
errs() << Command << ": error loading file '" << Filename
<< "': " << Error << "\n";
return 1;
}
// List the symbols.
outs() << Filename << ":\n";
for (int I = 0, E = Module->getSymbolCount(); I != E; ++I)
outs() << Module->getSymbolName(I) << "\n";
}
return 0;
}
int main(int argc, char **argv) {
// Print a stack trace if we signal out.
sys::PrintStackTraceOnErrorSignal();
@ -107,6 +151,9 @@ int main(int argc, char **argv) {
// set up the TargetOptions for the machine
TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
if (ListSymbolsOnly)
return listSymbols(argv[0], Options);
unsigned BaseArg = 0;
LTOCodeGenerator CodeGen;