diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/JumpInstrTables.cpp')
-rw-r--r-- | contrib/llvm/lib/CodeGen/JumpInstrTables.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/contrib/llvm/lib/CodeGen/JumpInstrTables.cpp b/contrib/llvm/lib/CodeGen/JumpInstrTables.cpp index 750f71f..75fa261 100644 --- a/contrib/llvm/lib/CodeGen/JumpInstrTables.cpp +++ b/contrib/llvm/lib/CodeGen/JumpInstrTables.cpp @@ -13,7 +13,6 @@ #define DEBUG_TYPE "jt" #include "llvm/CodeGen/JumpInstrTables.h" - #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/JumpInstrTableInfo.h" #include "llvm/CodeGen/Passes.h" @@ -30,7 +29,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" - #include <vector> using namespace llvm; @@ -117,8 +115,8 @@ bool replaceGlobalValueIndirectUse(GlobalValue *GV, Value *V, Use *U) { if (!isa<GlobalAlias>(C)) C->replaceUsesOfWithOnConstant(GV, V, U); } else { - assert(false && "The Use of a Function symbol is neither an instruction nor" - " a constant"); + llvm_unreachable("The Use of a Function symbol is neither an instruction " + "nor a constant"); } return true; @@ -163,7 +161,7 @@ void JumpInstrTables::getAnalysisUsage(AnalysisUsage &AU) const { Function *JumpInstrTables::insertEntry(Module &M, Function *Target) { FunctionType *OrigFunTy = Target->getFunctionType(); - FunctionType *FunTy = transformType(OrigFunTy); + FunctionType *FunTy = transformType(JTType, OrigFunTy); JumpMap::iterator it = Metadata.find(FunTy); if (Metadata.end() == it) { @@ -191,11 +189,12 @@ Function *JumpInstrTables::insertEntry(Module &M, Function *Target) { } bool JumpInstrTables::hasTable(FunctionType *FunTy) { - FunctionType *TransTy = transformType(FunTy); + FunctionType *TransTy = transformType(JTType, FunTy); return Metadata.end() != Metadata.find(TransTy); } -FunctionType *JumpInstrTables::transformType(FunctionType *FunTy) { +FunctionType *JumpInstrTables::transformType(JumpTable::JumpTableType JTT, + FunctionType *FunTy) { // Returning nullptr forces all types into the same table, since all types map // to the same type Type *VoidPtrTy = Type::getInt8PtrTy(FunTy->getContext()); @@ -211,7 +210,7 @@ FunctionType *JumpInstrTables::transformType(FunctionType *FunTy) { Type *Int32Ty = Type::getInt32Ty(FunTy->getContext()); FunctionType *VoidFnTy = FunctionType::get( Type::getVoidTy(FunTy->getContext()), EmptyParams, false); - switch (JTType) { + switch (JTT) { case JumpTable::Single: return FunctionType::get(RetTy, EmptyParams, false); @@ -253,10 +252,10 @@ FunctionType *JumpInstrTables::transformType(FunctionType *FunTy) { bool JumpInstrTables::runOnModule(Module &M) { JITI = &getAnalysis<JumpInstrTableInfo>(); - // Get the set of jumptable-annotated functions. + // Get the set of jumptable-annotated functions that have their address taken. DenseMap<Function *, Function *> Functions; for (Function &F : M) { - if (F.hasFnAttribute(Attribute::JumpTable)) { + if (F.hasFnAttribute(Attribute::JumpTable) && F.hasAddressTaken()) { assert(F.hasUnnamedAddr() && "Attribute 'jumptable' requires 'unnamed_addr'"); Functions[&F] = nullptr; |