mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
6b73c7cf07
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 llvm-svn: 309694
54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
//===-- FEntryInsertion.cpp - Patchable prologues for LLVM -------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file edits function bodies to insert fentry calls.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/Target/TargetFrameLowering.h"
|
|
#include "llvm/Target/TargetInstrInfo.h"
|
|
#include "llvm/Target/TargetSubtargetInfo.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
struct FEntryInserter : public MachineFunctionPass {
|
|
static char ID; // Pass identification, replacement for typeid
|
|
FEntryInserter() : MachineFunctionPass(ID) {
|
|
initializeFEntryInserterPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
bool runOnMachineFunction(MachineFunction &F) override;
|
|
};
|
|
}
|
|
|
|
bool FEntryInserter::runOnMachineFunction(MachineFunction &MF) {
|
|
const std::string FEntryName =
|
|
MF.getFunction()->getFnAttribute("fentry-call").getValueAsString();
|
|
if (FEntryName != "true")
|
|
return false;
|
|
|
|
auto &FirstMBB = *MF.begin();
|
|
auto *TII = MF.getSubtarget().getInstrInfo();
|
|
BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(),
|
|
TII->get(TargetOpcode::FENTRY_CALL));
|
|
return true;
|
|
}
|
|
|
|
char FEntryInserter::ID = 0;
|
|
char &llvm::FEntryInserterID = FEntryInserter::ID;
|
|
INITIALIZE_PASS(FEntryInserter, "fentry-insert", "Insert fentry calls", false,
|
|
false)
|