@@ -2758,8 +2758,6 @@ namespace {
2758
2758
struct FillOp {
2759
2759
CanType Type;
2760
2760
Optional<ProtocolConformanceRef> Conformance;
2761
- Size ToOffset;
2762
- bool IsRelative;
2763
2761
};
2764
2762
2765
2763
SmallVector<FillOp, 8 > FillOps;
@@ -2836,7 +2834,10 @@ namespace {
2836
2834
// fill indexes are word-indexed.
2837
2835
Address metadataWords (IGF.Builder .CreateBitCast (metadataValue, IGM.Int8PtrPtrTy ),
2838
2836
IGM.getPointerAlignment ());
2839
-
2837
+
2838
+ auto genericReqtOffset = IGM.getMetadataLayout (Target)
2839
+ .getGenericRequirementsOffset (IGF);
2840
+
2840
2841
for (auto &fillOp : FillOps) {
2841
2842
llvm::Value *value;
2842
2843
if (fillOp.Conformance ) {
@@ -2846,20 +2847,12 @@ namespace {
2846
2847
}
2847
2848
2848
2849
auto dest = createPointerSizedGEP (IGF, metadataWords,
2849
- fillOp.ToOffset - AddressPoint);
2850
+ genericReqtOffset.getStatic ());
2851
+ genericReqtOffset = genericReqtOffset.offsetBy (
2852
+ IGF, IGM.getPointerSize ());
2850
2853
2851
- // A far relative indirectable pointer.
2852
- if (fillOp.IsRelative ) {
2853
- dest = IGF.Builder .CreateElementBitCast (dest,
2854
- IGM.FarRelativeAddressTy );
2855
- IGF.emitStoreOfRelativeIndirectablePointer (value, dest,
2856
- /* isFar*/ true );
2857
-
2858
- // A direct pointer.
2859
- } else {
2860
- value = IGF.Builder .CreateBitCast (value, IGM.Int8PtrTy );
2861
- IGF.Builder .CreateStore (value, dest);
2862
- }
2854
+ value = IGF.Builder .CreateBitCast (value, IGM.Int8PtrTy );
2855
+ IGF.Builder .CreateStore (value, dest);
2863
2856
}
2864
2857
2865
2858
// Initialize the instantiated dependent value witness table, if we have
@@ -2894,12 +2887,6 @@ namespace {
2894
2887
return f;
2895
2888
}
2896
2889
2897
- void addFillOp (CanType type, Optional<ProtocolConformanceRef> conf,
2898
- bool isRelative) {
2899
- FillOps.push_back ({type, conf, getNextOffsetFromTemplateHeader (),
2900
- isRelative });
2901
- }
2902
-
2903
2890
public:
2904
2891
void createMetadataAccessFunction () {
2905
2892
(void ) getGenericTypeMetadataAccessFunction (IGM, Target, ForDefinition);
@@ -2981,14 +2968,14 @@ namespace {
2981
2968
2982
2969
template <class ... T>
2983
2970
void addGenericArgument (CanType type, T &&...args) {
2984
- addFillOp ( type, None, /* relative */ false );
2971
+ FillOps. push_back ({ type, None} );
2985
2972
super::addGenericArgument (type, std::forward<T>(args)...);
2986
2973
}
2987
2974
2988
2975
template <class ... T>
2989
2976
void addGenericWitnessTable (CanType type, ProtocolConformanceRef conf,
2990
2977
T &&...args) {
2991
- addFillOp ( type, conf, /* relative */ false );
2978
+ FillOps. push_back ({ type, conf} );
2992
2979
super::addGenericWitnessTable (type, conf, std::forward<T>(args)...);
2993
2980
}
2994
2981
0 commit comments