From: Alex Lorenz Date: Fri, 21 Aug 2015 21:54:12 +0000 (+0000) Subject: MIR Serialization: Serialize the pointer IR expression values in the machine X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=c7804ab6e5052fcc776d1d173ee4f085c37800f6 MIR Serialization: Serialize the pointer IR expression values in the machine memory operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245745 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 8346ff294e4..28f9d4e298f 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -527,6 +527,30 @@ static Cursor maybeLexNewline(Cursor C, MIToken &Token) { return C; } +static Cursor maybeLexEscapedIRValue( + Cursor C, MIToken &Token, + function_ref ErrorCallback) { + if (C.peek() != '`') + return None; + auto Range = C; + C.advance(); + auto StrRange = C; + while (C.peek() != '`') { + if (C.isEOF() || isNewlineChar(C.peek())) { + ErrorCallback( + C.location(), + "end of machine instruction reached before the closing '`'"); + Token.reset(MIToken::Error, Range.remaining()); + return C; + } + C.advance(); + } + StringRef Value = StrRange.upto(C); + C.advance(); + Token.reset(MIToken::QuotedIRValue, Range.upto(C)).setStringValue(Value); + return C; +} + StringRef llvm::lexMIToken( StringRef Source, MIToken &Token, function_ref ErrorCallback) { @@ -570,6 +594,8 @@ StringRef llvm::lexMIToken( return R.remaining(); if (Cursor R = maybeLexNewline(C, Token)) return R.remaining(); + if (Cursor R = maybeLexEscapedIRValue(C, Token, ErrorCallback)) + return R.remaining(); Token.reset(MIToken::Error, C.remaining()); ErrorCallback(C.location(), diff --git a/lib/CodeGen/MIRParser/MILexer.h b/lib/CodeGen/MIRParser/MILexer.h index 35c526be812..ff54aa3554d 100644 --- a/lib/CodeGen/MIRParser/MILexer.h +++ b/lib/CodeGen/MIRParser/MILexer.h @@ -115,7 +115,8 @@ struct MIToken { NamedIRBlock, IRBlock, NamedIRValue, - IRValue + IRValue, + QuotedIRValue // `` }; private: diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index e7fb4378121..83ba5a2c90b 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -982,7 +982,8 @@ bool MIParser::parseIRConstant(StringRef::iterator Loc, StringRef StringValue, const Constant *&C) { auto Source = StringValue.str(); // The source has to be null terminated. SMDiagnostic Err; - C = parseConstantValue(Source.c_str(), Err, *MF.getFunction()->getParent()); + C = parseConstantValue(Source.c_str(), Err, *MF.getFunction()->getParent(), + &IRSlots); if (!C) return error(Loc + Err.getColumnNo(), Err.getMessage()); return false; @@ -1557,6 +1558,13 @@ bool MIParser::parseIRValue(const Value *&V) { V = GV; break; } + case MIToken::QuotedIRValue: { + const Constant *C = nullptr; + if (parseIRConstant(Token.location(), Token.stringValue(), C)) + return true; + V = C; + break; + } default: llvm_unreachable("The current token should be an IR block reference"); } @@ -1662,7 +1670,8 @@ bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { } if (Token.isNot(MIToken::NamedIRValue) && Token.isNot(MIToken::IRValue) && Token.isNot(MIToken::GlobalValue) && - Token.isNot(MIToken::NamedGlobalValue)) + Token.isNot(MIToken::NamedGlobalValue) && + Token.isNot(MIToken::QuotedIRValue)) return error("expected an IR value reference"); const Value *V = nullptr; if (parseIRValue(V)) diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index aa3d193695a..05bb320d8e6 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -613,17 +613,18 @@ void MIPrinter::printIRValueReference(const Value &V) { V.printAsOperand(OS, /*PrintType=*/false, MST); return; } + if (isa(V)) { + // Machine memory operands can load/store to/from constant value pointers. + OS << '`'; + V.printAsOperand(OS, /*PrintType=*/true, MST); + OS << '`'; + return; + } OS << "%ir."; if (V.hasName()) { printLLVMNameWithoutPrefix(OS, V.getName()); return; } - if (isa(V)) { - // Machine memory operands can load/store to/from constant value pointers. - // TODO: Serialize the constant values. - OS << ""; - return; - } printIRSlotNumber(OS, MST.getLocalSlot(&V)); } diff --git a/test/CodeGen/MIR/X86/memory-operands.mir b/test/CodeGen/MIR/X86/memory-operands.mir index 6621b7e2e75..0f9b38feda2 100644 --- a/test/CodeGen/MIR/X86/memory-operands.mir +++ b/test/CodeGen/MIR/X86/memory-operands.mir @@ -170,6 +170,16 @@ !11 = !{i8 0, i8 2} + %st = type { i32, i32 } + + @values = common global [50 x %st] zeroinitializer, align 16 + + define void @gep_value(i64 %d) { + entry: + %conv = trunc i64 %d to i32 + store i32 %conv, i32* getelementptr inbounds ([50 x %st], [50 x %st]* @values, i64 0, i64 0, i32 0), align 16 + ret void + } ... --- name: test @@ -465,3 +475,18 @@ body: | %al = MOV8rm killed %rdi, 1, _, 0, _ :: (load 1 from %ir.x, !range !11) RETQ %al ... +--- +name: gep_value +tracksRegLiveness: true +liveins: + - { reg: '%rdi' } +body: | + bb.0.entry: + liveins: %rdi + + %rax = MOV64rm %rip, 1, _, @values, _ :: (load 8 from got) + ; CHECK-LABEL: gep_value + ; CHECK: MOV32mr killed %rax, 1, _, 0, _, %edi, implicit killed %rdi :: (store 4 into `i32* getelementptr inbounds ([50 x %st], [50 x %st]* @values, i64 0, i64 0, i32 0)`, align 16) + MOV32mr killed %rax, 1, _, 0, _, %edi, implicit killed %rdi :: (store 4 into `i32* getelementptr inbounds ([50 x %st], [50 x %st]* @values, i64 0, i64 0, i32 0)`, align 16) + RETQ +... diff --git a/test/CodeGen/MIR/X86/unrecognized-character.mir b/test/CodeGen/MIR/X86/unrecognized-character.mir index 845ccc8c6d5..cf99028677f 100644 --- a/test/CodeGen/MIR/X86/unrecognized-character.mir +++ b/test/CodeGen/MIR/X86/unrecognized-character.mir @@ -12,6 +12,6 @@ name: foo body: | bb.0.entry: - ; CHECK: [[@LINE+1]]:5: unexpected character '`' - ` RETQ + ; CHECK: [[@LINE+1]]:5: unexpected character '\' + \ RETQ ...