mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
NVPTX: Use MapMetadata() instead of custom/stale/untested logic
Copy the `GVMap` over to a standard `ValueToValueMapTy` so that we can reuse the `MapMetadata()` logic. Unfortunately the `GVMap` can't just be replaced, since `MapMetadata()` likes to modify the map, but at least this will prevent NVPTX from bitrotting. llvm-svn: 225944
This commit is contained in:
parent
f10473b136
commit
52c27eeccb
@ -26,6 +26,7 @@
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/ValueMap.h"
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -54,8 +55,7 @@ private:
|
||||
IRBuilder<> &Builder);
|
||||
Value *remapConstantExpr(Module *M, Function *F, ConstantExpr *C,
|
||||
IRBuilder<> &Builder);
|
||||
void remapNamedMDNode(Module *M, NamedMDNode *N);
|
||||
MDNode *remapMDNode(Module *M, MDNode *N);
|
||||
void remapNamedMDNode(ValueToValueMapTy &VM, NamedMDNode *N);
|
||||
|
||||
typedef ValueMap<GlobalVariable *, GlobalVariable *> GVMapTy;
|
||||
typedef ValueMap<Constant *, Value *> ConstantToValueMapTy;
|
||||
@ -125,12 +125,17 @@ bool GenericToNVVM::runOnModule(Module &M) {
|
||||
ConstantToValueMap.clear();
|
||||
}
|
||||
|
||||
// Copy GVMap over to a standard value map.
|
||||
ValueToValueMapTy VM;
|
||||
for (auto I = GVMap.begin(), E = GVMap.end(); I != E; ++I)
|
||||
VM[I->first] = I->second;
|
||||
|
||||
// Walk through the metadata section and update the debug information
|
||||
// associated with the global variables in the default address space.
|
||||
for (Module::named_metadata_iterator I = M.named_metadata_begin(),
|
||||
E = M.named_metadata_end();
|
||||
I != E; I++) {
|
||||
remapNamedMDNode(&M, I);
|
||||
remapNamedMDNode(VM, I);
|
||||
}
|
||||
|
||||
// Walk through the global variable initializers, and replace any use of
|
||||
@ -362,7 +367,7 @@ Value *GenericToNVVM::remapConstantExpr(Module *M, Function *F, ConstantExpr *C,
|
||||
}
|
||||
}
|
||||
|
||||
void GenericToNVVM::remapNamedMDNode(Module *M, NamedMDNode *N) {
|
||||
void GenericToNVVM::remapNamedMDNode(ValueToValueMapTy &VM, NamedMDNode *N) {
|
||||
|
||||
bool OperandChanged = false;
|
||||
SmallVector<MDNode *, 16> NewOperands;
|
||||
@ -372,7 +377,7 @@ void GenericToNVVM::remapNamedMDNode(Module *M, NamedMDNode *N) {
|
||||
// converted to another value.
|
||||
for (unsigned i = 0; i < NumOperands; ++i) {
|
||||
MDNode *Operand = N->getOperand(i);
|
||||
MDNode *NewOperand = remapMDNode(M, Operand);
|
||||
MDNode *NewOperand = MapMetadata(Operand, VM);
|
||||
OperandChanged |= Operand != NewOperand;
|
||||
NewOperands.push_back(NewOperand);
|
||||
}
|
||||
@ -390,39 +395,3 @@ void GenericToNVVM::remapNamedMDNode(Module *M, NamedMDNode *N) {
|
||||
N->addOperand(*I);
|
||||
}
|
||||
}
|
||||
|
||||
MDNode *GenericToNVVM::remapMDNode(Module *M, MDNode *N) {
|
||||
|
||||
bool OperandChanged = false;
|
||||
SmallVector<Metadata *, 8> NewOperands;
|
||||
unsigned NumOperands = N->getNumOperands();
|
||||
|
||||
// Check if any operand is or contains a global variable in GVMap, and thus
|
||||
// converted to another value.
|
||||
for (unsigned i = 0; i < NumOperands; ++i) {
|
||||
Metadata *Operand = N->getOperand(i);
|
||||
Metadata *NewOperand = Operand;
|
||||
if (Operand) {
|
||||
if (auto *N = dyn_cast<MDNode>(Operand)) {
|
||||
NewOperand = remapMDNode(M, N);
|
||||
} else if (auto *C = dyn_cast<ConstantAsMetadata>(Operand)) {
|
||||
if (auto *G = dyn_cast<GlobalVariable>(C->getValue())) {
|
||||
GVMapTy::iterator I = GVMap.find(G);
|
||||
if (I != GVMap.end())
|
||||
NewOperand = ConstantAsMetadata::get(I->second);
|
||||
}
|
||||
}
|
||||
}
|
||||
OperandChanged |= Operand != NewOperand;
|
||||
NewOperands.push_back(NewOperand);
|
||||
}
|
||||
|
||||
// If none of the operands has been modified, return N as it is.
|
||||
if (!OperandChanged) {
|
||||
return N;
|
||||
}
|
||||
|
||||
// If any of the operands has been modified, create a new MDNode with the new
|
||||
// operands.
|
||||
return MDNode::get(M->getContext(), makeArrayRef(NewOperands));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user