2021SC@SDUSC
今天分析的是src/mapleall/maple_driver/src/as_compiler.cpp ·中as_compiler.cpp.
该c++文件包含了include文件中compiler.h 和file_utils.h两个头文件。
compiler.h中定义了诸多string类型的常量。
const std::string kBinNameNone = "";
const std::string kBinNameJbc2mpl = "jbc2mpl";
const std::string kBinNameCpp2mpl = "mplfe";
const std::string kBinNameClang = "clang";
const std::string kBinNameDex2mpl = "dex2mpl";
const std::string kBinNameMplipa = "mplipa";
const std::string kBinNameMe = "me";
const std::string kBinNameMpl2mpl = "mpl2mpl";
const std::string kBinNameMplcg = "mplcg";
const std::string kBinNameMapleComb = "maplecomb";
const std::string kBinNameLd = "ld";
const std::string kMachine = "aarch64-";
const std::string kVendor = "unknown-";
const std::string kOperatingSystem = "linux-gnu-";
const std::string kGccFlag = "gcc";
const std::string kGppFlag = "g++";
const std::string kAsFlag = "as";
const std::string kBinNameAs = kMachine + kOperatingSystem + kAsFlag;
const std::string kBinNameGcc = kMachine + kOperatingSystem + kGccFlag;
const std::string kBinNameGpp = kMachine + kOperatingSystem + kGppFlag;
std::string AsCompiler::GetBinPath(const MplOptions&) const {
#ifdef ANDROID
return "prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/";
#else
return std::string(std::getenv(kMapleRoot)) + "/tools/gcc-linaro-7.5.0/bin/";
#endif
}
首先判断是否为安卓设备,返回一个string类型的路径。
const std::string &AsCompiler::GetBinName() const {
return kBinNameAs;
}
DefaultOption AsCompiler::GetDefaultOptions(const MplOptions&) const {
DefaultOption defaultOptions = { nullptr, 0 };
return defaultOptions;
}
std::string AsCompiler::GetInputFileName(const MplOptions &options) const {
return options.GetOutputFolder() + options.GetOutputName() + ".s";
}
void AsCompiler::GetTmpFilesToDelete(const MplOptions &mplOptions, std::vector<std::string> &tempFiles) const {
tempFiles.push_back(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
}
std::unordered_set<std::string> AsCompiler::GetFinalOutputs(const MplOptions &mplOptions) const {
auto finalOutputs = std::unordered_set<std::string>();
(void)finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
return finalOutputs;
}
const std::string &AsCompiler::GetBinName() const {
return kBinNameAs;
}
getBinName()方法,返回在compiler.h中定义的常量kBinNameAs
DefaultOption AsCompiler::GetDefaultOptions(const MplOptions&) const {
DefaultOption defaultOptions = { nullptr, 0 };
return defaultOptions;
}
getDefaultOptions()方法,传入一个MplOptions类型的变量,定义一个key为nullptr,length为0的DefaultOption型变量defaultOptions,返回defaultOptions。
std::string AsCompiler::GetInputFileName(const MplOptions &options) const {
return options.GetOutputFolder() + options.GetOutputName() + ".s";
}
getInputFileName()方法,传入一个MplOptions类型的变量options,调用MplOptions类的方法getOutputFolder()和getOutputName()。返回一个string类型的变量。
void AsCompiler::GetTmpFilesToDelete(const MplOptions &mplOptions, std::vector<std::string> &tempFiles) const {
tempFiles.push_back(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
}
getTmpFilesToDelete()方法,传入一个MplOptions类型的变量mplOptions以及一个string类型的向量tempFiles,对于mplOptions,调用MplOptions类的方法getOutputFolder()和getOutputName(),与“.o”构成字符串,添加到tempFiles。
std::unordered_set<std::string> AsCompiler::GetFinalOutputs(const MplOptions &mplOptions) const {
auto finalOutputs = std::unordered_set<std::string>();
(void)finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
return finalOutputs;
}
getFinalOutputs()方法,传入一个MplOptions类型的变量mplOptions,定义一个无序set容器finalOutputs,对于mplOptions,调用MplOptions类的方法getOutputFolder()和getOutputName(),与“.o”构成字符串,添加到finalOutputs。返回finalOutputs。