OSDN Git Service

[X86] Fix a crash in FEntryInserter Pass.
authorManoj Gupta <manojgupta@google.com>
Tue, 1 Aug 2017 15:39:12 +0000 (15:39 +0000)
committerManoj Gupta <manojgupta@google.com>
Tue, 1 Aug 2017 15:39:12 +0000 (15:39 +0000)
Summary:
FEntryInserter pass unconditionally derefs the first Instruction
in the first Basic Block. The pass crashes when the first
BasicBlock is empty. Fix the crash by not dereferencing the basic
Block iterator. This fixes an issue observed when building Linux kernel
4.4 with clang.

Fixes PR33971.

Reviewers: hfinkel, niravd, dblaikie

Reviewed By: niravd

Subscribers: davide, llvm-commits

Differential Revision: https://reviews.llvm.org/D35979

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309694 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/FEntryInserter.cpp
test/CodeGen/X86/fentry-insertion.ll

index 0759bf6..9781338 100644 (file)
@@ -41,10 +41,8 @@ bool FEntryInserter::runOnMachineFunction(MachineFunction &MF) {
     return false;
 
   auto &FirstMBB = *MF.begin();
-  auto &FirstMI = *FirstMBB.begin();
-
   auto *TII = MF.getSubtarget().getInstrInfo();
-  BuildMI(FirstMBB, FirstMI, FirstMI.getDebugLoc(),
+  BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(),
           TII->get(TargetOpcode::FENTRY_CALL));
   return true;
 }
index a585d96..c5fb3b2 100644 (file)
@@ -12,5 +12,19 @@ entry:
 ; CHECK: retq
 }
 
-attributes #0 = { "fentry-call"="true" }
+define void @test2() #1 {
+entry:
+  br label %bb1
+bb1:
+  call void @address_taken(i64 ptrtoint (i8* blockaddress(@test2, %bb1) to i64), i32 512)
+  ret void
 
+; CHECK-LABEL: @test2
+; CHECK: callq __fentry__
+; CHECK-NOT: mcount
+; CHECK: retq
+}
+
+declare void @address_taken(i64, i32) local_unnamed_addr
+attributes #0 = { "fentry-call"="true" }
+attributes #1 = { inlinehint minsize noredzone nounwind optsize sspstrong "fentry-call"="true" }