10baa4809a8de135a6a7abe9cd78a86f208c99164Chandler Carruth//===---- llvm/MDBuilder.h - Builder for LLVM metadata ----------*- C++ -*-===// 2e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// 3e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// The LLVM Compiler Infrastructure 4e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// 5e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// This file is distributed under the University of Illinois Open Source 6e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// License. See LICENSE.TXT for details. 7e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// 8e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands//===----------------------------------------------------------------------===// 9e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// 10e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// This file defines the MDBuilder class, which is used as a convenient way to 11e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// create LLVM metadata with a consistent and simplified interface. 12e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands// 13e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands//===----------------------------------------------------------------------===// 14e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_MDBUILDER_H 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_MDBUILDER_H 17e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/DataTypes.h" 19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <utility> 20e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 21e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sandsnamespace llvm { 22e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 23244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszakclass APInt; 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate <typename T> class ArrayRef; 25244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszakclass LLVMContext; 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MDNode; 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MDString; 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass StringRef; 29244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 30244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszakclass MDBuilder { 31244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak LLVMContext &Context; 32244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 33244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszakpublic: 34244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak MDBuilder(LLVMContext &context) : Context(context) {} 35244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 36244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return the given string as metadata. 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDString *createString(StringRef Str); 38244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 39244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 40244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak // FPMath metadata. 41244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 42244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 43244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata with the given settings. The special value 0.0 44244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// for the Accuracy parameter indicates the default (maximal precision) 45244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// setting. 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createFPMath(float Accuracy); 47244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 48244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 49244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak // Prof metadata. 50244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 51244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 52244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata containing two branch weights. 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight); 54244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 55244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata containing a number of branch weights. 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createBranchWeights(ArrayRef<uint32_t> Weights); 57244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 58244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 59244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak // Range metadata. 60244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 61244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 62244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata describing the range [Lo, Hi). 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createRange(const APInt &Lo, const APInt &Hi); 64244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 65244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 66244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak // TBAA metadata. 67244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak //===------------------------------------------------------------------===// 68244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 69244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata appropriate for a TBAA root node. Each returned 70244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// node is distinct from all other metadata and will never be identified 71244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// (uniqued) with anything else. 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createAnonymousTBAARoot(); 73244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 74244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata appropriate for a TBAA root node with the given 75244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// name. This may be identified (uniqued) with other roots with the same 76244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// name. 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createTBAARoot(StringRef Name); 78244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 79244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata for a non-root TBAA node with the given name, 80244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// parent in the TBAA tree, and value for 'pointsToConstantMemory'. 81244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak MDNode *createTBAANode(StringRef Name, MDNode *Parent, 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isConstant = false); 83244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak 84244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak struct TBAAStructField { 85244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak uint64_t Offset; 86244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak uint64_t Size; 87244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak MDNode *TBAA; 88244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak TBAAStructField(uint64_t Offset, uint64_t Size, MDNode *TBAA) : 89244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak Offset(Offset), Size(Size), TBAA(TBAA) {} 90244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak }; 91656dc6260654a7fa29d223bcaf6aae048669c72dDuncan Sands 92244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// \brief Return metadata for a tbaa.struct node with the given 93244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak /// struct field descriptions. 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode *createTBAAStructNode(ArrayRef<TBAAStructField> Fields); 95c91249485527f69cf0d7e7b6dda9d8e6eb46d4b0Dan Gohman 96082bb7cf57e3a7089b8302a7d676fddf0bce276eManman Ren /// \brief Return metadata for a TBAA struct node in the type DAG 97327f0100d1c1aa738d13b45d70eab08d0d2030fbManman Ren /// with the given name, a list of pairs (offset, field type in the type DAG). 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MDNode * 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines createTBAAStructTypeNode(StringRef Name, 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ArrayRef<std::pair<MDNode *, uint64_t>> Fields); 101082bb7cf57e3a7089b8302a7d676fddf0bce276eManman Ren 102327f0100d1c1aa738d13b45d70eab08d0d2030fbManman Ren /// \brief Return metadata for a TBAA scalar type node with the 103327f0100d1c1aa738d13b45d70eab08d0d2030fbManman Ren /// given name, an offset and a parent in the TBAA type DAG. 104a5b314c27a585b979ac9c9da944aa3cec27d22a6Manman Ren MDNode *createTBAAScalarTypeNode(StringRef Name, MDNode *Parent, 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines uint64_t Offset = 0); 106327f0100d1c1aa738d13b45d70eab08d0d2030fbManman Ren 107082bb7cf57e3a7089b8302a7d676fddf0bce276eManman Ren /// \brief Return metadata for a TBAA tag node with the given 108082bb7cf57e3a7089b8302a7d676fddf0bce276eManman Ren /// base type, access type and offset relative to the base type. 109082bb7cf57e3a7089b8302a7d676fddf0bce276eManman Ren MDNode *createTBAAStructTagNode(MDNode *BaseType, MDNode *AccessType, 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines uint64_t Offset); 111244b7a4ba66a8c23b6d0463eafc53b9a3970fc02Jakub Staszak}; 112e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 113e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands} // end namespace llvm 114e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands 115e747fadedf8c5b80f1a0d5e84078a4428e06098eDuncan Sands#endif 116