From 471eaccd514a164b7be7c73be3b3f44f7f77ac70 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Mon, 21 Oct 2019 13:58:33 +0000 Subject: [PATCH] [Alignment][NFC] Add a helper function to DataLayout Summary: This is patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: courbet Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69258 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375413 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/DataLayout.h | 7 +++++++ unittests/IR/DataLayoutTest.cpp | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/llvm/IR/DataLayout.h b/include/llvm/IR/DataLayout.h index 08fd269807a..8988f7d3c30 100644 --- a/include/llvm/IR/DataLayout.h +++ b/include/llvm/IR/DataLayout.h @@ -504,6 +504,13 @@ public: /// Returns the minimum ABI-required alignment for the specified type. unsigned getABITypeAlignment(Type *Ty) const; + /// Helper function to return `Alignment` if it's set or the result of + /// `getABITypeAlignment(Ty)`, in any case the result is a valid alignment. + inline Align getValueOrABITypeAlignment(MaybeAlign Alignment, + Type *Ty) const { + return Alignment ? *Alignment : Align(getABITypeAlignment(Ty)); + } + /// Returns the minimum ABI-required alignment for an integer type of /// the specified bitwidth. Align getABIIntegerTypeAlignment(unsigned BitWidth) const; diff --git a/unittests/IR/DataLayoutTest.cpp b/unittests/IR/DataLayoutTest.cpp index e24e8e045db..de8ac253c45 100644 --- a/unittests/IR/DataLayoutTest.cpp +++ b/unittests/IR/DataLayoutTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "llvm/IR/DataLayout.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Type.h" #include "gtest/gtest.h" using namespace llvm; @@ -44,4 +46,14 @@ TEST(DataLayoutTest, FunctionPtrAlign) { EXPECT_EQ(a, c); } +TEST(DataLayoutTest, ValueOrABITypeAlignment) { + const DataLayout DL("Fi8"); + LLVMContext Context; + Type *const FourByteAlignType = Type::getInt32Ty(Context); + EXPECT_EQ(Align(16), + DL.getValueOrABITypeAlignment(MaybeAlign(16), FourByteAlignType)); + EXPECT_EQ(Align(4), + DL.getValueOrABITypeAlignment(MaybeAlign(), FourByteAlignType)); +} + } // anonymous namespace -- 2.40.0