Skip to content

Commit 6ff2890

Browse files
committed
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 bca6baa commit 6ff2890

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
@@ -4320,7 +4320,12 @@ GenericRequirementsMetadata irgen::addGenericRequirements(
43204320
// WebAssembly: hack: Wasm doesn't support PC-relative offsets.
43214321
// also doesn't handle tag yet
43224322
if (IGM.TargetInfo.OutputObjectFormat == llvm::Triple::Wasm) {
4323-
B.add(llvm::ConstantExpr::getPtrToInt(descriptorRef.getValue(), IGM.RelativeAddressTy, false));
4323+
llvm::Constant *offset = llvm::ConstantExpr::getPtrToInt(descriptorRef.getValue(), IGM.RelativeAddressTy, false);
4324+
// borrowed from addTaggedRelativeOffset
4325+
if (tag) {
4326+
offset = llvm::ConstantExpr::getAdd(offset, llvm::ConstantInt::get(IGM.RelativeAddressTy, tag));
4327+
}
4328+
B.add(offset);
43244329
return;
43254330
}
43264331

0 commit comments

Comments
 (0)