mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
IR: Add MDSubprogram::replaceFunction()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229742 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
87356edf74
commit
a9d82a512f
@ -968,6 +968,17 @@ public:
|
||||
Metadata *getDeclaration() const { return getOperand(9); }
|
||||
Metadata *getVariables() const { return getOperand(10); }
|
||||
|
||||
/// \brief Replace the function.
|
||||
///
|
||||
/// If \a isUniqued() and not \a isResolved(), this could node will be
|
||||
/// RAUW'ed and deleted out from under the caller. Use a \a TrackingMDRef if
|
||||
/// that's a problem.
|
||||
/// @{
|
||||
void replaceFunction(Function *F);
|
||||
void replaceFunction(ConstantAsMetadata *MD) { replaceOperandWith(7, MD); }
|
||||
void replaceFunction(std::nullptr_t) { replaceOperandWith(7, nullptr); }
|
||||
/// @}
|
||||
|
||||
static bool classof(const Metadata *MD) {
|
||||
return MD->getMetadataID() == MDSubprogramKind;
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "LLVMContextImpl.h"
|
||||
#include "MetadataImpl.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -264,6 +265,11 @@ MDSubprogram *MDSubprogram::getImpl(
|
||||
Ops);
|
||||
}
|
||||
|
||||
void MDSubprogram::replaceFunction(Function *F) {
|
||||
replaceFunction(F ? ConstantAsMetadata::get(F)
|
||||
: static_cast<ConstantAsMetadata *>(nullptr));
|
||||
}
|
||||
|
||||
MDLexicalBlock *MDLexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope,
|
||||
Metadata *File, unsigned Line,
|
||||
unsigned Column, StorageType Storage,
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
@ -1189,6 +1190,42 @@ TEST_F(MDSubprogramTest, get) {
|
||||
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
|
||||
}
|
||||
|
||||
TEST_F(MDSubprogramTest, replaceFunction) {
|
||||
Metadata *Scope = MDTuple::getDistinct(Context, None);
|
||||
StringRef Name = "name";
|
||||
StringRef LinkageName = "linkage";
|
||||
Metadata *File = MDTuple::getDistinct(Context, None);
|
||||
unsigned Line = 2;
|
||||
Metadata *Type = MDTuple::getDistinct(Context, None);
|
||||
bool IsLocalToUnit = false;
|
||||
bool IsDefinition = true;
|
||||
unsigned ScopeLine = 3;
|
||||
Metadata *ContainingType = MDTuple::getDistinct(Context, None);
|
||||
unsigned Virtuality = 4;
|
||||
unsigned VirtualIndex = 5;
|
||||
unsigned Flags = 6;
|
||||
bool IsOptimized = false;
|
||||
Metadata *TemplateParams = MDTuple::getDistinct(Context, None);
|
||||
Metadata *Declaration = MDTuple::getDistinct(Context, None);
|
||||
Metadata *Variables = MDTuple::getDistinct(Context, None);
|
||||
|
||||
auto *N = MDSubprogram::get(
|
||||
Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
|
||||
IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags,
|
||||
IsOptimized, nullptr, TemplateParams, Declaration, Variables);
|
||||
|
||||
EXPECT_EQ(nullptr, N->getFunction());
|
||||
|
||||
std::unique_ptr<Function> F(
|
||||
Function::Create(FunctionType::get(Type::getVoidTy(Context), false),
|
||||
GlobalValue::ExternalLinkage));
|
||||
N->replaceFunction(F.get());
|
||||
EXPECT_EQ(ConstantAsMetadata::get(F.get()), N->getFunction());
|
||||
|
||||
N->replaceFunction(nullptr);
|
||||
EXPECT_EQ(nullptr, N->getFunction());
|
||||
}
|
||||
|
||||
typedef MetadataTest MDLexicalBlockTest;
|
||||
|
||||
TEST_F(MDLexicalBlockTest, get) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user