diff options
| author | Tom Roeder <tmroeder@google.com> | 2014-06-05 19:29:43 +0000 |
|---|---|---|
| committer | Tom Roeder <tmroeder@google.com> | 2014-06-05 19:29:43 +0000 |
| commit | 44cb65fff1fa26a2a1ff90290f172756f082c8a1 (patch) | |
| tree | bf434728cf43339c7a59346772330571289765b8 /llvm/lib/Analysis/JumpInstrTableInfo.cpp | |
| parent | f7e289c0f25c920368b28d0d9d3be64d882f32cb (diff) | |
| download | bcm5719-llvm-44cb65fff1fa26a2a1ff90290f172756f082c8a1.tar.gz bcm5719-llvm-44cb65fff1fa26a2a1ff90290f172756f082c8a1.zip | |
Add a new attribute called 'jumptable' that creates jump-instruction tables for functions marked with this attribute.
It includes a pass that rewrites all indirect calls to jumptable functions to pass through these tables.
This also adds backend support for generating the jump-instruction tables on ARM and X86.
Note that since the jumptable attribute creates a second function pointer for a
function, any function marked with jumptable must also be marked with unnamed_addr.
llvm-svn: 210280
Diffstat (limited to 'llvm/lib/Analysis/JumpInstrTableInfo.cpp')
| -rw-r--r-- | llvm/lib/Analysis/JumpInstrTableInfo.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/JumpInstrTableInfo.cpp b/llvm/lib/Analysis/JumpInstrTableInfo.cpp new file mode 100644 index 00000000000..b5b426533ff --- /dev/null +++ b/llvm/lib/Analysis/JumpInstrTableInfo.cpp @@ -0,0 +1,40 @@ +//===-- JumpInstrTableInfo.cpp: Info for Jump-Instruction Tables ----------===// +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief Information about jump-instruction tables that have been created by +/// JumpInstrTables pass. +/// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "jiti" + +#include "llvm/Analysis/JumpInstrTableInfo.h" +#include "llvm/Analysis/Passes.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Type.h" + +using namespace llvm; + +INITIALIZE_PASS(JumpInstrTableInfo, "jump-instr-table-info", + "Jump-Instruction Table Info", true, true) +char JumpInstrTableInfo::ID = 0; + +ImmutablePass *llvm::createJumpInstrTableInfoPass() { + return new JumpInstrTableInfo(); +} + +JumpInstrTableInfo::JumpInstrTableInfo() : ImmutablePass(ID), Tables() { + initializeJumpInstrTableInfoPass(*PassRegistry::getPassRegistry()); +} + +JumpInstrTableInfo::~JumpInstrTableInfo() {} + +void JumpInstrTableInfo::insertEntry(FunctionType *TableFunTy, Function *Target, + Function *Jump) { + Tables[TableFunTy].push_back(JumpPair(Target, Jump)); +} |

