mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 02:24:22 +00:00
SymbolRewriter: allow rewriting with comdats
COMDATs must be identically named to the symbol. When support for COMDATs was introduced, the symbol rewriter was not updated, resulting in rewriting failing for symbols which were placed into COMDATs. This corrects the behaviour and adds test cases for this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227261 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -79,6 +79,19 @@ static cl::list<std::string> RewriteMapFiles("rewrite-map-file",
|
||||
|
||||
namespace llvm {
|
||||
namespace SymbolRewriter {
|
||||
void rewriteComdat(Module &M, GlobalObject *GO, const std::string &Source,
|
||||
const std::string &Target) {
|
||||
if (Comdat *CD = GO->getComdat()) {
|
||||
auto &Comdats = M.getComdatSymbolTable();
|
||||
|
||||
Comdat *C = M.getOrInsertComdat(Target);
|
||||
C->setSelectionKind(CD->getSelectionKind());
|
||||
GO->setComdat(C);
|
||||
|
||||
Comdats.erase(Comdats.find(Source));
|
||||
}
|
||||
}
|
||||
|
||||
template <RewriteDescriptor::Type DT, typename ValueType,
|
||||
ValueType *(llvm::Module::*Get)(StringRef) const>
|
||||
class ExplicitRewriteDescriptor : public RewriteDescriptor {
|
||||
@ -102,10 +115,14 @@ template <RewriteDescriptor::Type DT, typename ValueType,
|
||||
bool ExplicitRewriteDescriptor<DT, ValueType, Get>::performOnModule(Module &M) {
|
||||
bool Changed = false;
|
||||
if (ValueType *S = (M.*Get)(Source)) {
|
||||
if (GlobalObject *GO = dyn_cast<GlobalObject>(S))
|
||||
rewriteComdat(M, GO, Source, Target);
|
||||
|
||||
if (Value *T = (M.*Get)(Target))
|
||||
S->setValueName(T->getValueName());
|
||||
else
|
||||
S->setName(Target);
|
||||
|
||||
Changed = true;
|
||||
}
|
||||
return Changed;
|
||||
@ -148,6 +165,9 @@ performOnModule(Module &M) {
|
||||
if (C.getName() == Name)
|
||||
continue;
|
||||
|
||||
if (GlobalObject *GO = dyn_cast<GlobalObject>(&C))
|
||||
rewriteComdat(M, GO, C.getName(), Name);
|
||||
|
||||
if (Value *V = (M.*Get)(Name))
|
||||
C.setValueName(V->getValueName());
|
||||
else
|
||||
|
Reference in New Issue
Block a user