From 62339073127df4579905f551f61c132cf21d2aad Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 24 Jan 2012 09:01:07 +0000 Subject: [PATCH] Add various "string" methods to ConstantDataSequential, which have the same semantics as ConstantArray's but much more efficient because they don't have to return std::string's. The ConstantArray methods will eventually be removed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148792 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Constants.h | 27 +++++++++++++++++++++++++++ lib/VMCore/Constants.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 958ebb88c75..21400e774d4 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -371,6 +371,9 @@ public: return reinterpret_cast(Value::getType()); } + // FIXME: String methods will eventually be removed. + + /// isString - This method returns true if the array is an array of i8 and /// the elements of the array are all ConstantInt's. bool isString() const; @@ -626,6 +629,30 @@ public: /// byte. uint64_t getElementByteSize() const; + + /// isString - This method returns true if this is an array of i8. + bool isString() const; + + /// isCString - This method returns true if the array "isString", ends with a + /// nul byte, and does not contains any other nul bytes. + bool isCString() const; + + /// getAsString - If this array is isString(), then this method returns the + /// array as a StringRef. Otherwise, it asserts out. + /// + StringRef getAsString() const; + + /// getAsCString - If this array is isCString(), then this method returns the + /// array (without the trailing null byte) as a StringRef. Otherwise, it + /// asserts out. + /// + StringRef getAsCString() const { + assert(isCString() && "Isn't a C string"); + StringRef Str = getAsString(); + return Str.substr(0, Str.size()-1); + } + + virtual void destroyConstant(); /// Methods for support type inquiry through isa, cast, and dyn_cast: diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 55b97ef7062..0525882828e 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -2221,7 +2221,34 @@ Constant *ConstantDataSequential::getElementAsConstant(unsigned Elt) const { return ConstantInt::get(getElementType(), getElementAsInteger(Elt)); } +/// isString - This method returns true if this is an array of i8. +bool ConstantDataSequential::isString() const { + return isa(getType()) && getElementType()->isIntegerTy(8); +} +/// getAsString - If this array is isString(), then this method returns the +/// array as a StringRef. Otherwise, it asserts out. +/// +StringRef ConstantDataSequential::getAsString() const { + assert(isString() && "Not a string"); + return StringRef(DataElements, getType()->getNumElements()); +} + + +/// isCString - This method returns true if the array "isString", ends with a +/// nul byte, and does not contains any other nul bytes. +bool ConstantDataSequential::isCString() const { + if (!isString()) + return false; + + StringRef Str = getAsString(); + + // The last value must be nul. + if (Str.back() != 0) return false; + + // Other elements must be non-nul. + return Str.drop_back().find(0) == StringRef::npos; +} //===----------------------------------------------------------------------===//