Skip to content

Commit 0a04e7a

Browse files
zhuoweikateinoigakukun
authored andcommitted
WebAssembly: fix GOT-relative pointers without PCrel
Previous commits changed a bunch of relative pointers to absolute in the metadata; at the time I didn't add support for adding tag bits, which signifies if the pointers point to the .got section (and thus needs an extra layer of indirection.) This broke _isCImportedTagType on $ss7UnicodeO5ASCIIOMn, so this commit adds back tag support for metadata pointers.
1 parent d5eb275 commit 0a04e7a

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/IRGen/ConstantBuilder.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,15 @@ class ConstantAggregateBuilderBase
9999
// WebAssembly: hack: doesn't support PCrel data relocations
100100
// also, we should set the lowest bit, but I don't know how to do that
101101
// there's no GOT on WebAssembly anyways though
102-
add(llvm::ConstantExpr::getPtrToInt(reference.getValue(), IGM().RelativeAddressTy, false));
102+
103+
104+
llvm::Constant *offset = llvm::ConstantExpr::getPtrToInt(reference.getValue(), IGM().RelativeAddressTy, false);
105+
// borrowed from addTaggedRelativeOffset
106+
unsigned tag = unsigned(reference.isIndirect());
107+
if (tag) {
108+
offset = llvm::ConstantExpr::getAdd(offset, llvm::ConstantInt::get(IGM().RelativeAddressTy, tag));
109+
}
110+
add(offset);
103111
return;
104112
}
105113
addTaggedRelativeOffset(IGM().RelativeAddressTy,

lib/IRGen/GenMeta.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4337,7 +4337,12 @@ GenericRequirementsMetadata irgen::addGenericRequirements(
43374337
// WebAssembly: hack: Wasm doesn't support PC-relative offsets.
43384338
// also doesn't handle tag yet
43394339
if (IGM.TargetInfo.OutputObjectFormat == llvm::Triple::Wasm) {
4340-
B.add(llvm::ConstantExpr::getPtrToInt(descriptorRef.getValue(), IGM.RelativeAddressTy, false));
4340+
llvm::Constant *offset = llvm::ConstantExpr::getPtrToInt(descriptorRef.getValue(), IGM.RelativeAddressTy, false);
4341+
// borrowed from addTaggedRelativeOffset
4342+
if (tag) {
4343+
offset = llvm::ConstantExpr::getAdd(offset, llvm::ConstantInt::get(IGM.RelativeAddressTy, tag));
4344+
}
4345+
B.add(offset);
43414346
return;
43424347
}
43434348

0 commit comments

Comments
 (0)