diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2014-02-12 11:42:02 +0000 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2014-02-12 11:42:02 +0000 |
commit | 691e6ef4614b96478200b65ea6cee90cf4c88165 (patch) | |
tree | f7501ba6208597ad2f3c4968a038f779b83c2c83 /clang/lib/Driver/Multilib.cpp | |
parent | be1d22b631ed03f213e87acd0b9479be3d46ca79 (diff) | |
download | bcm5719-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.cpp | 25 |
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; } } |