From 643f4bcad965ea3673acaa70436620eaa0a7b5b4 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Fri, 14 Aug 2015 21:14:50 +0000 Subject: [PATCH] MIR Serialization: Serialize the external symbol call entry pseudo source values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245098 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/PseudoSourceValue.h | 4 ++ lib/CodeGen/MIRParser/MIParser.cpp | 8 +++- lib/CodeGen/MIRPrinter.cpp | 7 +-- test/CodeGen/MIR/Mips/memory-operands.mir | 55 +++++++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/include/llvm/CodeGen/PseudoSourceValue.h b/include/llvm/CodeGen/PseudoSourceValue.h index e6b95235e41..f67552030db 100644 --- a/include/llvm/CodeGen/PseudoSourceValue.h +++ b/include/llvm/CodeGen/PseudoSourceValue.h @@ -132,6 +132,10 @@ class ExternalSymbolPseudoSourceValue : public CallEntryPseudoSourceValue { public: ExternalSymbolPseudoSourceValue(const char *ES); + static inline bool classof(const PseudoSourceValue *V) { + return V->kind() == ExternalSymbolCallEntry; + } + const char *getSymbol() const { return ES; } }; diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 31046b91cf8..b27a55b705d 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -1445,7 +1445,10 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { PSV = MF.getPSVManager().getGlobalValueCallEntry(GV); break; } - // TODO: Parse the other pseudo source values. + case MIToken::ExternalSymbol: + PSV = MF.getPSVManager().getExternalSymbolCallEntry( + MF.createExternalSymbolName(Token.stringValue())); + break; default: llvm_unreachable("The current token should be pseudo source value"); } @@ -1457,7 +1460,8 @@ bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) || Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table) || Token.is(MIToken::FixedStackObject) || Token.is(MIToken::GlobalValue) || - Token.is(MIToken::NamedGlobalValue)) { + Token.is(MIToken::NamedGlobalValue) || + Token.is(MIToken::ExternalSymbol)) { const PseudoSourceValue *PSV = nullptr; if (parseMemoryPseudoSourceValue(PSV)) return true; diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index 7e546eb845f..d70b5c412f1 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -767,9 +767,10 @@ void MIPrinter::print(const MachineMemOperand &Op) { cast(PVal)->getValue()->printAsOperand( OS, /*PrintType=*/false, MST); break; - default: - // TODO: Print the other pseudo source values. - OS << ""; + case PseudoSourceValue::ExternalSymbolCallEntry: + OS << '$'; + printLLVMNameWithoutPrefix( + OS, cast(PVal)->getSymbol()); break; } } diff --git a/test/CodeGen/MIR/Mips/memory-operands.mir b/test/CodeGen/MIR/Mips/memory-operands.mir index 9086ac1ff5d..965cda37812 100644 --- a/test/CodeGen/MIR/Mips/memory-operands.mir +++ b/test/CodeGen/MIR/Mips/memory-operands.mir @@ -10,6 +10,20 @@ } declare i32 @foo(i32) + + define float @test2() #0 { + entry: + %call = tail call float bitcast (float (...)* @g to float ()*)() + call void @__mips16_ret_sf(float %call) + ret float %call + } + + declare float @g(...) + + declare void @__mips16_ret_sf(float) #1 + + attributes #0 = { "saveS2" } + attributes #1 = { noinline readnone "__Mips16RetHelper" } ... --- name: test @@ -45,3 +59,44 @@ body: | %ra = Restore16 24, implicit-def %sp, implicit %sp RetRA16 implicit %v0 ... +--- +name: test2 +tracksRegLiveness: true +frameInfo: + stackSize: 32 + maxAlignment: 4 + adjustsStack: true + hasCalls: true + maxCallFrameSize: 16 +stack: + - { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, + callee-saved-register: '%ra' } + - { id: 1, type: spill-slot, offset: -8, size: 4, alignment: 4, + callee-saved-register: '%s2' } + - { id: 2, type: spill-slot, offset: -12, size: 4, alignment: 4, + callee-saved-register: '%s0' } +body: | + bb.0.entry: + liveins: %ra, %s2, %s0, %ra, %s2, %s0 + + SaveX16 %s0, %ra, %s2, 32, implicit-def %sp, implicit %sp + CFI_INSTRUCTION .cfi_def_cfa_offset 32 + CFI_INSTRUCTION .cfi_offset %ra_64, -4 + CFI_INSTRUCTION .cfi_offset %s2_64, -8 + CFI_INSTRUCTION .cfi_offset %s0_64, -12 + %v0, %v1 = GotPrologue16 $_gp_disp, $_gp_disp + %v0 = SllX16 killed %v0, 16 + %s0 = AdduRxRyRz16 killed %v1, killed %v0 + %v0 = LwRxRyOffMemX16 %s0, @g, 0 :: (load 4 from @g) + ; CHECK-LABEL: test2 + ; CHECK: %v1 = LwRxRyOffMemX16 %s0, $__mips16_call_stub_sf_0, 0 :: (load 4 from $__mips16_call_stub_sf_0) + %v1 = LwRxRyOffMemX16 %s0, $__mips16_call_stub_sf_0, 0 :: (load 4 from $__mips16_call_stub_sf_0) + %gp = COPY %s0 + JumpLinkReg16 killed %v1, csr_o32, implicit-def %ra, implicit %v0, implicit killed %gp, implicit-def %sp, implicit-def %v0 + %v1 = LwRxRyOffMemX16 %s0, @__mips16_ret_sf, 0 :: (load 4 from @__mips16_ret_sf) + %t9 = COPY %v1 + %gp = COPY killed %s0 + JumpLinkReg16 killed %v1, csr_mips16rethelper, implicit-def %ra, implicit killed %t9, implicit %v0, implicit killed %gp, implicit-def %sp + %s0, %ra, %s2 = RestoreX16 32, implicit-def %sp, implicit %sp + RetRA16 implicit %v0 +... -- 2.34.1