mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
llc: Add ability to parse mir from stdin
- Add -x <language> option to switch between IR and MIR inputs. - Change MIR parser to read from stdin when filename is '-'. - Add a simple mir roundtrip test. llvm-svn: 304825
This commit is contained in:
parent
5f498de20b
commit
938b489a87
@ -869,7 +869,7 @@ bool MIRParser::parseMachineFunctions(Module &M, MachineModuleInfo &MMI) {
|
||||
std::unique_ptr<MIRParser> llvm::createMIRParserFromFile(StringRef Filename,
|
||||
SMDiagnostic &Error,
|
||||
LLVMContext &Context) {
|
||||
auto FileOrErr = MemoryBuffer::getFile(Filename);
|
||||
auto FileOrErr = MemoryBuffer::getFileOrSTDIN(Filename);
|
||||
if (std::error_code EC = FileOrErr.getError()) {
|
||||
Error = SMDiagnostic(Filename, SourceMgr::DK_Error,
|
||||
"Could not open input file: " + EC.message());
|
||||
|
20
test/CodeGen/MIR/X86/roundtrip.mir
Normal file
20
test/CodeGen/MIR/X86/roundtrip.mir
Normal file
@ -0,0 +1,20 @@
|
||||
# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=none | llc -o - -x mir - -mtriple=x86_64-- -run-pass=none | FileCheck %s
|
||||
---
|
||||
# CHECK-LABEL: name: func0
|
||||
# CHECK: registers:
|
||||
# CHECK: - { id: 0, class: gr32, preferred-register: '' }
|
||||
# CHECK: - { id: 1, class: gr32, preferred-register: '' }
|
||||
# CHECK: body: |
|
||||
# CHECK: bb.0:
|
||||
# CHECK: %0 = MOV32r0 implicit-def %eflags
|
||||
# CHECK: dead %1 = COPY %0
|
||||
# CHECK: MOV32mr undef %rcx, 1, _, 0, _, killed %0 :: (volatile store 4)
|
||||
# CHECK: RETQ undef %eax
|
||||
name: func0
|
||||
body: |
|
||||
bb.0:
|
||||
%0 : gr32 = MOV32r0 implicit-def %eflags
|
||||
dead %1 : gr32 = COPY %0
|
||||
MOV32mr undef %rcx, 1, _, 0, _, killed %0 :: (volatile store 4)
|
||||
RETQ undef %eax
|
||||
...
|
@ -61,6 +61,9 @@ using namespace llvm;
|
||||
static cl::opt<std::string>
|
||||
InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
|
||||
|
||||
static cl::opt<std::string>
|
||||
InputLanguage("x", cl::desc("Input language ('ir' or 'mir')"));
|
||||
|
||||
static cl::opt<std::string>
|
||||
OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
|
||||
|
||||
@ -335,6 +338,12 @@ int main(int argc, char **argv) {
|
||||
llvm::make_unique<yaml::Output>(YamlFile->os()));
|
||||
}
|
||||
|
||||
if (InputLanguage != "" && InputLanguage != "ir" &&
|
||||
InputLanguage != "mir") {
|
||||
errs() << argv[0] << "Input language must be '', 'IR' or 'MIR'\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Compile the module TimeCompilations times to give better compile time
|
||||
// metrics.
|
||||
for (unsigned I = TimeCompilations; I; --I)
|
||||
@ -398,7 +407,8 @@ static int compileModule(char **argv, LLVMContext &Context) {
|
||||
|
||||
// If user just wants to list available options, skip module loading
|
||||
if (!SkipModule) {
|
||||
if (StringRef(InputFilename).endswith_lower(".mir")) {
|
||||
if (InputLanguage == "mir" ||
|
||||
(InputLanguage == "" && StringRef(InputFilename).endswith(".mir"))) {
|
||||
MIR = createMIRParserFromFile(InputFilename, Err, Context);
|
||||
if (MIR)
|
||||
M = MIR->parseIRModule();
|
||||
|
Loading…
x
Reference in New Issue
Block a user