Add !callees metadata

This patch adds a new kind of metadata that indicates the possible callees of
indirect calls.

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

llvm-svn: 315944
This commit is contained in:
Matthew Simpson 2017-10-16 22:22:11 +00:00
parent b0c9e0d647
commit 36bbc8ce98
6 changed files with 37 additions and 2 deletions

View File

@ -4878,6 +4878,23 @@ Example (assuming 64-bit pointers):
!0 = !{ i64 0, i64 256 }
!1 = !{ i64 -1, i64 -1 }
'``callees``' Metadata
^^^^^^^^^^^^^^^^^^^^^^
``callees`` metadata may be attached to indirect call sites. If ``callees``
metadata is attached to a call site, and any callee is not among the set of
functions provided by the metadata, the behavior is undefined. The intent of
this metadata is to facilitate optimizations such as indirect-call promotion.
For example, in the code below, the call instruction may only target the
``add`` or ``sub`` functions:
.. code-block:: llvm
%result = call i64 %binop(i64 %x, i64 %y), !callees !0
...
!0 = !{i64 (i64, i64)* @add, i64 (i64, i64)* @sub}
'``unpredictable``' Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -100,6 +100,7 @@ public:
MD_section_prefix = 20, // "section_prefix"
MD_absolute_symbol = 21, // "absolute_symbol"
MD_associated = 22, // "associated"
MD_callees = 23, // "callees"
};
/// Known operand bundle tag IDs, which always have the same value. All

View File

@ -84,6 +84,14 @@ public:
/// \brief Return metadata describing the range [Lo, Hi).
MDNode *createRange(Constant *Lo, Constant *Hi);
//===------------------------------------------------------------------===//
// Callees metadata.
//===------------------------------------------------------------------===//
/// \brief Return metadata indicating the possible callees of indirect
/// calls.
MDNode *createCallees(ArrayRef<Function *> Callees);
//===------------------------------------------------------------------===//
// AA metadata.
//===------------------------------------------------------------------===//

View File

@ -59,6 +59,7 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
{MD_section_prefix, "section_prefix"},
{MD_absolute_symbol, "absolute_symbol"},
{MD_associated, "associated"},
{MD_callees, "callees"},
};
for (auto &MDKind : MDKinds) {

View File

@ -14,6 +14,7 @@
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Metadata.h"
using namespace llvm;
@ -95,6 +96,13 @@ MDNode *MDBuilder::createRange(Constant *Lo, Constant *Hi) {
return MDNode::get(Context, {createConstant(Lo), createConstant(Hi)});
}
MDNode *MDBuilder::createCallees(ArrayRef<Function *> Callees) {
SmallVector<Metadata *, 4> Ops;
for (Function *F : Callees)
Ops.push_back(createConstant(F));
return MDNode::get(Context, Ops);
}
MDNode *MDBuilder::createAnonymousAARoot(StringRef Name, MDNode *Extra) {
// To ensure uniqueness the root node is self-referential.
auto Dummy = MDNode::getTemporary(Context, None);

View File

@ -10,13 +10,13 @@
; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t3.bc \
; RUN: -o /dev/null -stats \
; RUN: 2>&1 | FileCheck %s -check-prefix=LAZY
; LAZY: 51 bitcode-reader - Number of Metadata records loaded
; LAZY: 53 bitcode-reader - Number of Metadata records loaded
; LAZY: 2 bitcode-reader - Number of MDStrings loaded
; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t3.bc \
; RUN: -o /dev/null -disable-ondemand-mds-loading -stats \
; RUN: 2>&1 | FileCheck %s -check-prefix=NOTLAZY
; NOTLAZY: 60 bitcode-reader - Number of Metadata records loaded
; NOTLAZY: 62 bitcode-reader - Number of Metadata records loaded
; NOTLAZY: 7 bitcode-reader - Number of MDStrings loaded