summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Multilib.cpp
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2014-02-12 11:42:02 +0000
committerNAKAMURA Takumi <geek4civic@gmail.com>2014-02-12 11:42:02 +0000
commit691e6ef4614b96478200b65ea6cee90cf4c88165 (patch)
treef7501ba6208597ad2f3c4968a038f779b83c2c83 /clang/lib/Driver/Multilib.cpp
parentbe1d22b631ed03f213e87acd0b9479be3d46ca79 (diff)
downloadbcm5719-llvm-691e6ef4614b96478200b65ea6cee90cf4c88165.tar.gz
bcm5719-llvm-691e6ef4614b96478200b65ea6cee90cf4c88165.zip
clang/lib/Driver/Multilib.cpp: Rewrite normalizePathSegment() to be tolerant dosish pathsep.
FIXME: It could be more simple... llvm-svn: 201227
Diffstat (limited to 'clang/lib/Driver/Multilib.cpp')
-rw-r--r--clang/lib/Driver/Multilib.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/clang/lib/Driver/Multilib.cpp b/clang/lib/Driver/Multilib.cpp
index 746d01bfb24..6681e7f3649 100644
--- a/clang/lib/Driver/Multilib.cpp
+++ b/clang/lib/Driver/Multilib.cpp
@@ -29,15 +29,30 @@
using namespace clang::driver;
using namespace clang;
using namespace llvm::opt;
+using namespace llvm::sys;
+/// normalize Segment to "/foo/bar" or "".
static void normalizePathSegment(std::string &Segment) {
- if (Segment.empty() || Segment == "/." || Segment == "/" || Segment == ".") {
+ StringRef seg = Segment;
+
+ // Prune trailing "/" or "./"
+ while (1) {
+ StringRef last = *--path::end(seg);
+ if (last != ".")
+ break;
+ seg = path::parent_path(seg);
+ }
+
+ if (seg.empty() || seg == "/") {
Segment = "";
+ return;
+ }
+
+ // Add leading '/'
+ if (seg.front() != '/') {
+ Segment = "/" + seg.str();
} else {
- if (StringRef(Segment).back() == '/')
- Segment.erase(Segment.begin() + Segment.size() - 1);
- if (StringRef(Segment).front() != '/')
- Segment = "/" + Segment;
+ Segment = seg;
}
}
OpenPOWER on IntegriCloud