forked from OSchip/llvm-project
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:
parent
b0c9e0d647
commit
36bbc8ce98
|
@ -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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
//===------------------------------------------------------------------===//
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue