@@ -57,7 +57,10 @@ class CGBuilderTy : public CGBuilderBaseTy {
5757 CodeGenFunction *getCGF () const { return getInserter ().CGF ; }
5858
5959 llvm::Value *emitRawPointerFromAddress (Address Addr) const {
60- return Addr.getUnsignedPointer ();
60+ if (!Addr.isSigned ())
61+ return Addr.getUnsignedPointer ();
62+ assert (getCGF () && " CGF not set" );
63+ return Addr.emitRawPointerSlow (*getCGF ());
6164 }
6265
6366 // / Helper function to compute a GEP's offset and add it to Addr.
@@ -208,8 +211,8 @@ class CGBuilderTy : public CGBuilderBaseTy {
208211 const llvm::Twine &Name = " " ) {
209212 if (!Addr.hasOffset ())
210213 return Address (CreateAddrSpaceCast (Addr.getBasePointer (), Ty, Name),
211- ElementTy, Addr.getAlignment (), nullptr ,
212- Addr.isKnownNonNull ());
214+ ElementTy, Addr.getAlignment (), Addr. getPointerAuthInfo () ,
215+ nullptr , Addr.isKnownNonNull ());
213216 // Eagerly force a raw address if these is an offset.
214217 return RawAddress (
215218 CreateAddrSpaceCast (Addr.emitRawPointer (*getCGF ()), Ty, Name),
@@ -240,11 +243,14 @@ class CGBuilderTy : public CGBuilderBaseTy {
240243 const llvm::StructLayout *Layout = DL.getStructLayout (ElTy);
241244 auto Offset = CharUnits::fromQuantity (Layout->getElementOffset (Index));
242245
243- return Address (CreateStructGEP (Addr.getElementType (),
244- Addr.getUnsignedPointer (), Index, Name),
245- ElTy->getElementType (Index),
246- Addr.getAlignment ().alignmentAtOffset (Offset),
247- Addr.isKnownNonNull ());
246+ if (!Addr.isSigned ())
247+ return Address (CreateStructGEP (Addr.getElementType (),
248+ Addr.getUnsignedPointer (), Index, Name),
249+ ElTy->getElementType (Index),
250+ Addr.getAlignment ().alignmentAtOffset (Offset),
251+ Addr.isKnownNonNull ());
252+ Addr.addOffset (Offset, ElTy->getTypeAtIndex (Index), *this );
253+ return Addr;
248254 }
249255
250256 // / Given
@@ -262,12 +268,15 @@ class CGBuilderTy : public CGBuilderBaseTy {
262268 CharUnits EltSize =
263269 CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy->getElementType ()));
264270
265- return Address (
266- CreateInBoundsGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
267- {getSize (CharUnits::Zero ()), getSize (Index)}, Name),
268- ElTy->getElementType (),
269- Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
270- Addr.isKnownNonNull ());
271+ if (!Addr.isSigned ())
272+ return Address (
273+ CreateInBoundsGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
274+ {getSize (CharUnits::Zero ()), getSize (Index)}, Name),
275+ ElTy->getElementType (),
276+ Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
277+ Addr.isKnownNonNull ());
278+ Addr.addOffset (Index * EltSize, ElTy, *this );
279+ return Addr;
271280 }
272281
273282 // / Given
@@ -281,10 +290,14 @@ class CGBuilderTy : public CGBuilderBaseTy {
281290 const llvm::DataLayout &DL = BB->getDataLayout ();
282291 CharUnits EltSize = CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy));
283292
284- return Address (CreateInBoundsGEP (ElTy, Addr.getUnsignedPointer (),
285- getSize (Index), Name),
286- ElTy, Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
287- Addr.isKnownNonNull ());
293+ if (!Addr.isSigned ())
294+ return Address (CreateInBoundsGEP (ElTy, Addr.getUnsignedPointer (),
295+ getSize (Index), Name),
296+ ElTy,
297+ Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
298+ Addr.isKnownNonNull ());
299+ Addr.addOffset (Index * EltSize, ElTy, *this );
300+ return Addr;
288301 }
289302
290303 // / Given
@@ -298,10 +311,12 @@ class CGBuilderTy : public CGBuilderBaseTy {
298311 const llvm::DataLayout &DL = BB->getDataLayout ();
299312 CharUnits EltSize = CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy));
300313
301- return Address (
302- CreateGEP (ElTy, Addr.getUnsignedPointer (), getSize (Index), Name),
303- Addr.getElementType (),
304- Addr.getAlignment ().alignmentAtOffset (Index * EltSize));
314+ if (!Addr.isSigned ())
315+ return Address (
316+ CreateGEP (ElTy, Addr.getUnsignedPointer (), getSize (Index), Name),
317+ ElTy, Addr.getAlignment ().alignmentAtOffset (Index * EltSize));
318+ Addr.addOffset (Index * EltSize, ElTy, *this );
319+ return Addr;
305320 }
306321
307322 // / Create GEP with single dynamic index. The address alignment is reduced
@@ -323,21 +338,28 @@ class CGBuilderTy : public CGBuilderBaseTy {
323338 Address CreateConstInBoundsByteGEP (Address Addr, CharUnits Offset,
324339 const llvm::Twine &Name = " " ) {
325340 assert (Addr.getElementType () == TypeCache.Int8Ty );
326- return Address (
327- CreateInBoundsGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
328- getSize (Offset), Name),
329- Addr.getElementType (), Addr.getAlignment ().alignmentAtOffset (Offset),
330- Addr.isKnownNonNull ());
341+
342+ if (!Addr.isSigned ())
343+ return Address (
344+ CreateInBoundsGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
345+ getSize (Offset), Name),
346+ Addr.getElementType (), Addr.getAlignment ().alignmentAtOffset (Offset),
347+ Addr.isKnownNonNull ());
348+ Addr.addOffset (Offset, TypeCache.Int8Ty , *this );
349+ return Addr;
331350 }
332351
333352 Address CreateConstByteGEP (Address Addr, CharUnits Offset,
334353 const llvm::Twine &Name = " " ) {
335354 assert (Addr.getElementType () == TypeCache.Int8Ty );
336355
337- return Address (CreateGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
338- getSize (Offset), Name),
339- Addr.getElementType (),
340- Addr.getAlignment ().alignmentAtOffset (Offset));
356+ if (!Addr.isSigned ())
357+ return Address (CreateGEP (Addr.getElementType (), Addr.getUnsignedPointer (),
358+ getSize (Offset), Name),
359+ Addr.getElementType (),
360+ Addr.getAlignment ().alignmentAtOffset (Offset));
361+ Addr.addOffset (Offset, TypeCache.Int8Ty , *this );
362+ return Addr;
341363 }
342364
343365 using CGBuilderBaseTy::CreateConstInBoundsGEP2_32;
@@ -364,10 +386,12 @@ class CGBuilderTy : public CGBuilderBaseTy {
364386 Address CreateInBoundsGEP (Address Addr, ArrayRef<llvm::Value *> IdxList,
365387 llvm::Type *ElementType, CharUnits Align,
366388 const Twine &Name = " " ) {
367- return RawAddress (CreateInBoundsGEP (Addr.getElementType (),
368- emitRawPointerFromAddress (Addr),
369- IdxList, Name),
370- ElementType, Align, Addr.isKnownNonNull ());
389+ if (!Addr.isSigned ())
390+ return RawAddress (CreateInBoundsGEP (Addr.getElementType (),
391+ emitRawPointerFromAddress (Addr),
392+ IdxList, Name),
393+ ElementType, Align, Addr.isKnownNonNull ());
394+ return addGEPOffset (Addr, IdxList, Align, true , Name);
371395 }
372396
373397 using CGBuilderBaseTy::CreateIsNull;
0 commit comments