aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Support/StringExtras.cpp46
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp4
-rw-r--r--lib/VMCore/Module.cpp17
3 files changed, 30 insertions, 37 deletions
diff --git a/lib/Support/StringExtras.cpp b/lib/Support/StringExtras.cpp
index 1b233ab200..65b41d526f 100644
--- a/lib/Support/StringExtras.cpp
+++ b/lib/Support/StringExtras.cpp
@@ -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);
}
}
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index ff69066985..228ec9f2d6 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -9538,7 +9538,7 @@ bool X86TargetLowering::ExpandInlineAsm(CallInst *CI) const {
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 @@ bool X86TargetLowering::ExpandInlineAsm(CallInst *CI) const {
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();
diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp
index 03b1252849..510f3d5bd7 100644
--- a/lib/VMCore/Module.cpp
+++ b/lib/VMCore/Module.cpp
@@ -76,11 +76,12 @@ Module::~Module() {
/// 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 @@ Module::Endianness Module::getEndianness() const {
/// 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)