[llvm-commits] [llvm] r93161 - in /llvm/trunk: include/llvm/ADT/StringExtras.h lib/Support/StringExtras.cpp lib/Target/X86/X86ISelLowering.cpp lib/VMCore/Module.cpp tools/lto/LTOCodeGenerator.cpp utils/TableGen/CodeGenInstruction.cpp

nicolas geoffray nicolas.geoffray at gmail.com
Sun Jan 17 12:53:13 PST 2010


Hi Benjamin,

There is a bug in your changes: the Module::getPointerSize function now
returns AnyPointerSize for the following data layout:
e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32

It should return Pointer32.

I will try to investigate a bit more.

Cheers,
Nicolas

On Mon, Jan 11, 2010 at 7:03 PM, Benjamin Kramer
<benny.kra at googlemail.com>wrote:

> Author: d0k
> Date: Mon Jan 11 12:03:24 2010
> New Revision: 93161
>
> URL: http://llvm.org/viewvc/llvm-project?rev=93161&view=rev
> Log:
> Reimplement getToken and SplitString as "StringRef helper functions"
>
> - getToken is modeled after StringRef::split but it can split on multiple
>  separator chars and skips leading seperators.
> - SplitString is a StringRef::split variant for more than 2 elements with
> the
>  same behaviour as getToken.
>
> Modified:
>    llvm/trunk/include/llvm/ADT/StringExtras.h
>    llvm/trunk/lib/Support/StringExtras.cpp
>    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>    llvm/trunk/lib/VMCore/Module.cpp
>    llvm/trunk/tools/lto/LTOCodeGenerator.cpp
>    llvm/trunk/utils/TableGen/CodeGenInstruction.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/StringExtras.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringExtras.h?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/StringExtras.h (original)
> +++ llvm/trunk/include/llvm/ADT/StringExtras.h Mon Jan 11 12:03:24 2010
> @@ -20,9 +20,9 @@
>  #include <cctype>
>  #include <cstdio>
>  #include <string>
> -#include <vector>
>
>  namespace llvm {
> +template<typename T> class SmallVectorImpl;
>
>  /// hexdigit - Return the (uppercase) hexadecimal character for the
>  /// given number \arg X (which should be less than 16).
> @@ -206,16 +206,16 @@
>  /// leading characters that appear in the Delimiters string, and ending
> the
>  /// token at any of the characters that appear in the Delimiters string.
>  If
>  /// there are no tokens in the source string, an empty string is returned.
> -/// The Source source string is updated in place to remove the returned
> string
> -/// and any delimiter prefix from it.
> -std::string getToken(std::string &Source,
> -                     const char *Delimiters = " \t\n\v\f\r");
> +/// The function returns a pair containing the extracted token and the
> +/// remaining tail string.
> +std::pair<StringRef, StringRef> getToken(StringRef Source,
> +                                         StringRef Delimiters = "
> \t\n\v\f\r");
>
>  /// SplitString - Split up the specified string according to the specified
>  /// delimiters, appending the result fragments to the output list.
> -void SplitString(const std::string &Source,
> -                 std::vector<std::string> &OutFragments,
> -                 const char *Delimiters = " \t\n\v\f\r");
> +void SplitString(StringRef Source,
> +                 SmallVectorImpl<StringRef> &OutFragments,
> +                 StringRef Delimiters = " \t\n\v\f\r");
>
>  /// HashString - Hash funtion for strings.
>  ///
>
> Modified: llvm/trunk/lib/Support/StringExtras.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/StringExtras.cpp?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/Support/StringExtras.cpp (original)
> +++ llvm/trunk/lib/Support/StringExtras.cpp Mon Jan 11 12:03:24 2010
> @@ -11,50 +11,40 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>
> -#include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/SmallVector.h"
> -#include <cstring>
> +#include "llvm/ADT/STLExtras.h"
> +#include "llvm/ADT/StringExtras.h"
>  using namespace llvm;
>
>  /// getToken - This function extracts one token from source, ignoring any
>  /// leading characters that appear in the Delimiters string, and ending
> the
>  /// token at any of the characters that appear in the Delimiters string.
>  If
>  /// there are no tokens in the source string, an empty string is returned.
> -/// The Source source string is updated in place to remove the returned
> string
> -/// and any delimiter prefix from it.
> -std::string llvm::getToken(std::string &Source, const char *Delimiters) {
> -  size_t NumDelimiters = std::strlen(Delimiters);
> -
> +/// The function returns a pair containing the extracted token and the
> +/// remaining tail string.
> +std::pair<StringRef, StringRef> llvm::getToken(StringRef Source,
> +                                               StringRef Delimiters) {
>   // Figure out where the token starts.
> -  std::string::size_type Start =
> -    Source.find_first_not_of(Delimiters, 0, NumDelimiters);
> -  if (Start == std::string::npos) Start = Source.size();
> -
> -  // Find the next occurance of the delimiter.
> -  std::string::size_type End =
> -    Source.find_first_of(Delimiters, Start, NumDelimiters);
> -  if (End == std::string::npos) End = Source.size();
> -
> -  // Create the return token.
> -  std::string Result = std::string(Source.begin()+Start,
> Source.begin()+End);
> +  StringRef::size_type Start = Source.find_first_not_of(Delimiters);
> +  if (Start == StringRef::npos) Start = Source.size();
>
> -  // Erase the token that we read in.
> -  Source.erase(Source.begin(), Source.begin()+End);
> +  // Find the next occurrence of the delimiter.
> +  StringRef::size_type End = Source.find_first_of(Delimiters, Start);
> +  if (End == StringRef::npos) End = Source.size();
>
> -  return Result;
> +  return std::make_pair(Source.substr(Start, End), Source.substr(End));
>  }
>
>  /// SplitString - Split up the specified string according to the specified
>  /// delimiters, appending the result fragments to the output list.
> -void llvm::SplitString(const std::string &Source,
> -                       std::vector<std::string> &OutFragments,
> -                       const char *Delimiters) {
> -  std::string S = Source;
> -
> -  std::string S2 = getToken(S, Delimiters);
> +void llvm::SplitString(StringRef Source,
> +                       SmallVectorImpl<StringRef> &OutFragments,
> +                       StringRef Delimiters) {
> +  StringRef S2, S;
> +  tie(S2, S) = getToken(Source, Delimiters);
>   while (!S2.empty()) {
>     OutFragments.push_back(S2);
> -    S2 = getToken(S, Delimiters);
> +    tie(S2, S) = getToken(S, Delimiters);
>   }
>  }
>
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jan 11 12:03:24 2010
> @@ -9538,7 +9538,7 @@
>   std::string AsmStr = IA->getAsmString();
>
>   // TODO: should remove alternatives from the asmstring: "foo {a|b}" ->
> "foo a"
> -  std::vector<std::string> AsmPieces;
> +  SmallVector<StringRef, 4> AsmPieces;
>   SplitString(AsmStr, AsmPieces, "\n");  // ; as separator?
>
>   switch (AsmPieces.size()) {
> @@ -9575,7 +9575,7 @@
>         Constraints[0].Codes.size() == 1 && Constraints[0].Codes[0] == "A"
> &&
>         Constraints[1].Codes.size() == 1 && Constraints[1].Codes[0] == "0")
> {
>       // bswap %eax / bswap %edx / xchgl %eax, %edx  -> llvm.bswap.i64
> -      std::vector<std::string> Words;
> +      SmallVector<StringRef, 4> Words;
>       SplitString(AsmPieces[0], Words, " \t");
>       if (Words.size() == 2 && Words[0] == "bswap" && Words[1] == "%eax") {
>         Words.clear();
>
> Modified: llvm/trunk/lib/VMCore/Module.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Module.cpp?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Module.cpp (original)
> +++ llvm/trunk/lib/VMCore/Module.cpp Mon Jan 11 12:03:24 2010
> @@ -76,11 +76,12 @@
>
>  /// Target endian information...
>  Module::Endianness Module::getEndianness() const {
> -  std::string temp = DataLayout;
> +  StringRef temp = DataLayout;
>   Module::Endianness ret = AnyEndianness;
>
>   while (!temp.empty()) {
> -    std::string token = getToken(temp, "-");
> +    StringRef token = DataLayout;
> +    tie(token, temp) = getToken(DataLayout, "-");
>
>     if (token[0] == 'e') {
>       ret = LittleEndian;
> @@ -94,15 +95,17 @@
>
>  /// Target Pointer Size information...
>  Module::PointerSize Module::getPointerSize() const {
> -  std::string temp = DataLayout;
> +  StringRef temp = DataLayout;
>   Module::PointerSize ret = AnyPointerSize;
>
>   while (!temp.empty()) {
> -    std::string token = getToken(temp, "-");
> -    char signal = getToken(token, ":")[0];
> +    StringRef token, signalToken;
> +    tie(token, temp) = getToken(temp, "-");
> +    tie(signalToken, token) = getToken(token, ":");
>
> -    if (signal == 'p') {
> -      int size = atoi(getToken(token, ":").c_str());
> +    if (signalToken[0] == 'p') {
> +      int size = 0;
> +      getToken(token, ":").first.getAsInteger(10, size);
>       if (size == 32)
>         ret = Pointer32;
>       else if (size == 64)
>
> Modified: llvm/trunk/tools/lto/LTOCodeGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.cpp?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/tools/lto/LTOCodeGenerator.cpp Mon Jan 11 12:03:24 2010
> @@ -443,12 +443,12 @@
>  /// Optimize merged modules using various IPO passes
>  void LTOCodeGenerator::setCodeGenDebugOptions(const char* options)
>  {
> -    std::string ops(options);
> -    for (std::string o = getToken(ops); !o.empty(); o = getToken(ops)) {
> +    for (std::pair<StringRef, StringRef> o = getToken(options);
> +         !o.first.empty(); o = getToken(o.second)) {
>         // ParseCommandLineOptions() expects argv[0] to be program name.
>         // Lazily add that.
>         if ( _codegenOptions.empty() )
>             _codegenOptions.push_back("libLTO");
> -        _codegenOptions.push_back(strdup(o.c_str()));
> +        _codegenOptions.push_back(strdup(o.first.str().c_str()));
>     }
>  }
>
> Modified: llvm/trunk/utils/TableGen/CodeGenInstruction.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenInstruction.cpp?rev=93161&r1=93160&r2=93161&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenInstruction.cpp (original)
> +++ llvm/trunk/utils/TableGen/CodeGenInstruction.cpp Mon Jan 11 12:03:24
> 2010
> @@ -14,6 +14,7 @@
>  #include "CodeGenInstruction.h"
>  #include "Record.h"
>  #include "llvm/ADT/StringExtras.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include <set>
>  using namespace llvm;
>
> @@ -224,7 +225,8 @@
>   // Parse the DisableEncoding field.
>   std::string DisableEncoding = R->getValueAsString("DisableEncoding");
>   while (1) {
> -    std::string OpName = getToken(DisableEncoding, " ,\t");
> +    std::string OpName;
> +    tie(OpName, DisableEncoding) = getToken(DisableEncoding, " ,\t");
>     if (OpName.empty()) break;
>
>     // Figure out which operand this is.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20100117/e14d24eb/attachment.html>


More information about the llvm-commits mailing list