forked from OSchip/llvm-project
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:
parent
52ee5e446b
commit
f9abf4fb0c
|
@ -0,0 +1,4 @@
|
|||
@glob = global i32 0
|
||||
define void @bar() {
|
||||
ret void
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue