From 78536664386887a26157fa90fceb003edbe80290 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Tue, 1 May 2018 20:49:42 +0000 Subject: [PATCH] Create a MachineBasicBlock for created IR-level BasicBlock MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit While running the lit tests for the most recent version of D45916 (https://reviews.llvm.org/D45916), I found that a couple tests for this pass suddenly started segfaulting. Since the outliner wasn't actually doing anything to the code in either of these tests I got curious. I found that the pass doesn’t completely create the machine-level constructs necessary to actually add a MachineFunction and MachineBasicBlock to the module. This patch adds in those missing bits. After this, adding the outliner before this pass won’t cause it to segfault. You can recreate this behaviour by adding the MachineOutliner directly before the pass and having it return false immediately. https://reviews.llvm.org/D46330 llvm-svn: 331307 --- llvm/lib/Target/X86/X86RetpolineThunks.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/llvm/lib/Target/X86/X86RetpolineThunks.cpp b/llvm/lib/Target/X86/X86RetpolineThunks.cpp index d03826b..f37c3fb 100644 --- a/llvm/lib/Target/X86/X86RetpolineThunks.cpp +++ b/llvm/lib/Target/X86/X86RetpolineThunks.cpp @@ -214,6 +214,15 @@ void X86RetpolineThunks::createThunkFunction(Module &M, StringRef Name) { IRBuilder<> Builder(Entry); Builder.CreateRetVoid(); + + // MachineFunctions/MachineBasicBlocks aren't created automatically for the + // IR-level constructs we already made. Create them and insert them into the + // module. + MachineFunction &MF = MMI->getOrCreateMachineFunction(*F); + MachineBasicBlock *EntryMBB = MF.CreateMachineBasicBlock(Entry); + + // Insert EntryMBB into MF. It's not in the module until we do this. + MF.insert(MF.end(), EntryMBB); } void X86RetpolineThunks::insertRegReturnAddrClobber(MachineBasicBlock &MBB, -- 2.7.4