1515#include " llvm/Analysis/Utils/Local.h"
1616#include " llvm/IR/DataLayout.h"
1717#include " llvm/IR/IRBuilder.h"
18- #include " llvm/IR/Module.h"
1918#include " llvm/IR/Type.h"
2019
2120namespace clang {
@@ -57,27 +56,7 @@ class CGBuilderTy : public CGBuilderBaseTy {
5756 CodeGenFunction *getCGF () const { return getInserter ().CGF ; }
5857
5958 llvm::Value *emitRawPointerFromAddress (Address Addr) const {
60- if (!Addr.isSigned ())
61- return Addr.getUnsignedPointer ();
62- assert (getCGF () && " CGF not set" );
63- return Addr.emitRawPointerSlow (*getCGF ());
64- }
65-
66- // / Helper function to compute a GEP's offset and add it to Addr.
67- Address addGEPOffset (Address Addr, ArrayRef<llvm::Value *> IdxList,
68- CharUnits Align, bool IsInBounds, const Twine &Name) {
69- typedef ArrayRef<llvm::Value *>::const_iterator IdxItTy;
70- typedef llvm::generic_gep_type_iterator<IdxItTy> GEPTypeIt;
71- const llvm::DataLayout &DL = BB->getParent ()->getParent ()->getDataLayout ();
72- GEPTypeIt GTI = GEPTypeIt::begin (Addr.getElementType (), IdxList.begin ());
73- IdxItTy IdxBegin = IdxList.begin (), IdxEnd = IdxList.end ();
74- llvm::Type *GEPType = Addr.getType ();
75- SmallString<12 > Buffer;
76- StringRef GEPName = Name.toStringRef (Buffer);
77- std::pair<llvm::Value *, llvm::Type *> OffsetAndType = llvm::EmitGEPOffset (
78- this , DL, GTI, IdxBegin, IdxEnd, GEPType, GEPName, IsInBounds, false );
79- Addr.addOffset (OffsetAndType.first , OffsetAndType.second , *this , Align);
80- return Addr;
59+ return Addr.getBasePointer ();
8160 }
8261
8362 template <bool IsInBounds>
@@ -243,14 +222,11 @@ class CGBuilderTy : public CGBuilderBaseTy {
243222 const llvm::StructLayout *Layout = DL.getStructLayout (ElTy);
244223 auto Offset = CharUnits::fromQuantity (Layout->getElementOffset (Index));
245224
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;
225+ return Address (CreateStructGEP (Addr.getElementType (), Addr.getBasePointer (),
226+ Index, Name),
227+ ElTy->getElementType (Index),
228+ Addr.getAlignment ().alignmentAtOffset (Offset),
229+ Addr.isKnownNonNull ());
254230 }
255231
256232 // / Given
@@ -268,15 +244,12 @@ class CGBuilderTy : public CGBuilderBaseTy {
268244 CharUnits EltSize =
269245 CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy->getElementType ()));
270246
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;
247+ return Address (
248+ CreateInBoundsGEP (Addr.getElementType (), Addr.getBasePointer (),
249+ {getSize (CharUnits::Zero ()), getSize (Index)}, Name),
250+ ElTy->getElementType (),
251+ Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
252+ Addr.isKnownNonNull ());
280253 }
281254
282255 // / Given
@@ -290,14 +263,10 @@ class CGBuilderTy : public CGBuilderBaseTy {
290263 const llvm::DataLayout &DL = BB->getDataLayout ();
291264 CharUnits EltSize = CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy));
292265
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;
266+ return Address (
267+ CreateInBoundsGEP (ElTy, Addr.getBasePointer (), getSize (Index), Name),
268+ ElTy, Addr.getAlignment ().alignmentAtOffset (Index * EltSize),
269+ Addr.isKnownNonNull ());
301270 }
302271
303272 // / Given
@@ -311,12 +280,9 @@ class CGBuilderTy : public CGBuilderBaseTy {
311280 const llvm::DataLayout &DL = BB->getDataLayout ();
312281 CharUnits EltSize = CharUnits::fromQuantity (DL.getTypeAllocSize (ElTy));
313282
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;
283+ return Address (CreateGEP (ElTy, Addr.getBasePointer (), getSize (Index), Name),
284+ Addr.getElementType (),
285+ Addr.getAlignment ().alignmentAtOffset (Index * EltSize));
320286 }
321287
322288 // / Create GEP with single dynamic index. The address alignment is reduced
@@ -338,28 +304,20 @@ class CGBuilderTy : public CGBuilderBaseTy {
338304 Address CreateConstInBoundsByteGEP (Address Addr, CharUnits Offset,
339305 const llvm::Twine &Name = " " ) {
340306 assert (Addr.getElementType () == TypeCache.Int8Ty );
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;
307+ return Address (
308+ CreateInBoundsGEP (Addr.getElementType (), Addr.getBasePointer (),
309+ getSize (Offset), Name),
310+ Addr.getElementType (), Addr.getAlignment ().alignmentAtOffset (Offset),
311+ Addr.isKnownNonNull ());
350312 }
351313
352314 Address CreateConstByteGEP (Address Addr, CharUnits Offset,
353315 const llvm::Twine &Name = " " ) {
354316 assert (Addr.getElementType () == TypeCache.Int8Ty );
355-
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;
317+ return Address (CreateGEP (Addr.getElementType (), Addr.getBasePointer (),
318+ getSize (Offset), Name),
319+ Addr.getElementType (),
320+ Addr.getAlignment ().alignmentAtOffset (Offset));
363321 }
364322
365323 using CGBuilderBaseTy::CreateConstInBoundsGEP2_32;
@@ -386,12 +344,10 @@ class CGBuilderTy : public CGBuilderBaseTy {
386344 Address CreateInBoundsGEP (Address Addr, ArrayRef<llvm::Value *> IdxList,
387345 llvm::Type *ElementType, CharUnits Align,
388346 const Twine &Name = " " ) {
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);
347+ return RawAddress (CreateInBoundsGEP (Addr.getElementType (),
348+ emitRawPointerFromAddress (Addr),
349+ IdxList, Name),
350+ ElementType, Align, Addr.isKnownNonNull ());
395351 }
396352
397353 using CGBuilderBaseTy::CreateIsNull;
0 commit comments