1*cb14a3feSDimitry Andric //===- Utils.cpp ----------------------------------------------------------===// 2*cb14a3feSDimitry Andric // 3*cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*cb14a3feSDimitry Andric // 7*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 8*cb14a3feSDimitry Andric // 9*cb14a3feSDimitry Andric // Implements utility functions for TextAPI Darwin operations. 10*cb14a3feSDimitry Andric // 11*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 12*cb14a3feSDimitry Andric 13*cb14a3feSDimitry Andric #include "llvm/TextAPI/Utils.h" 14*cb14a3feSDimitry Andric 15*cb14a3feSDimitry Andric using namespace llvm; 16*cb14a3feSDimitry Andric using namespace llvm::MachO; 17*cb14a3feSDimitry Andric replace_extension(SmallVectorImpl<char> & Path,const Twine & Extension)18*cb14a3feSDimitry Andricvoid llvm::MachO::replace_extension(SmallVectorImpl<char> &Path, 19*cb14a3feSDimitry Andric const Twine &Extension) { 20*cb14a3feSDimitry Andric StringRef P(Path.begin(), Path.size()); 21*cb14a3feSDimitry Andric auto ParentPath = sys::path::parent_path(P); 22*cb14a3feSDimitry Andric auto Filename = sys::path::filename(P); 23*cb14a3feSDimitry Andric 24*cb14a3feSDimitry Andric if (!ParentPath.ends_with(Filename.str() + ".framework")) { 25*cb14a3feSDimitry Andric sys::path::replace_extension(Path, Extension); 26*cb14a3feSDimitry Andric return; 27*cb14a3feSDimitry Andric } 28*cb14a3feSDimitry Andric // Framework dylibs do not have a file extension, in those cases the new 29*cb14a3feSDimitry Andric // extension is appended. e.g. given Path: "Foo.framework/Foo" and Extension: 30*cb14a3feSDimitry Andric // "tbd", the result is "Foo.framework/Foo.tbd". 31*cb14a3feSDimitry Andric SmallString<8> Storage; 32*cb14a3feSDimitry Andric StringRef Ext = Extension.toStringRef(Storage); 33*cb14a3feSDimitry Andric 34*cb14a3feSDimitry Andric // Append '.' if needed. 35*cb14a3feSDimitry Andric if (!Ext.empty() && Ext[0] != '.') 36*cb14a3feSDimitry Andric Path.push_back('.'); 37*cb14a3feSDimitry Andric 38*cb14a3feSDimitry Andric // Append extension. 39*cb14a3feSDimitry Andric Path.append(Ext.begin(), Ext.end()); 40*cb14a3feSDimitry Andric } 41