15 #include "llvm/ADT/Optional.h" 16 #include "llvm/ADT/StringSwitch.h" 17 #include "llvm/MC/MCSubtargetInfo.h" 18 #include "llvm/MC/SubtargetFeature.h" 19 #include "llvm/Option/ArgList.h" 20 #include "llvm/Support/FileSystem.h" 25 using namespace clang;
33 return llvm::StringSwitch<llvm::Optional<StringRef>>(MCU)
39 const StringRef PossibleAVRLibcLocations[] = {
53 if (!Args.hasArg(options::OPT_nostdlib) &&
54 !Args.hasArg(options::OPT_nodefaultlibs) &&
55 !Args.hasArg(options::OPT_c )) {
60 D.
Diag(diag::warn_drv_avr_mcu_not_specified);
65 if (!FamilyName.hasValue()) {
68 D.
Diag(diag::warn_drv_avr_family_linking_stdlibs_not_implemented)
72 D.
Diag(diag::warn_drv_avr_gcc_not_found);
73 }
else if (!AVRLibcRoot.hasValue()) {
75 D.
Diag(diag::warn_drv_avr_libc_not_found);
78 std::string LibcRoot = AVRLibcRoot.getValue();
80 getFilePaths().push_back(LibcRoot + std::string(
"/lib/") +
81 std::string(*FamilyName));
82 getFilePaths().push_back(LibcRoot + std::string(
"/lib/") +
83 std::string(*FamilyName));
85 std::string(*FamilyName));
92 D.
Diag(diag::warn_drv_avr_stdlib_not_linked);
104 const char *LinkingOutput)
const {
109 std::string
Linker = getToolChain().GetProgramPath(getShortName());
110 ArgStringList CmdArgs;
113 CmdArgs.push_back(
"-o");
117 CmdArgs.push_back(
"--gc-sections");
120 Args.AddAllArgs(CmdArgs, options::OPT_L);
121 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
127 assert(!CPU.empty() &&
"CPU name must be known in order to link stdlibs");
130 std::string CrtFileName = std::string(
"-l:crt") + CPU + std::string(
".o");
131 CmdArgs.push_back(Args.MakeArgString(CrtFileName));
133 CmdArgs.push_back(
"-lgcc");
134 CmdArgs.push_back(
"-lm");
135 CmdArgs.push_back(
"-lc");
138 CmdArgs.push_back(Args.MakeArgString(std::string(
"-l") + CPU));
144 CmdArgs.push_back(Args.MakeArgString(std::string(
"-m") + *FamilyName));
147 C.
addCommand(std::make_unique<Command>(JA, *
this, Args.MakeArgString(Linker),
152 for (StringRef PossiblePath : PossibleAVRLibcLocations) {
154 if (llvm::sys::fs::is_directory(PossiblePath))
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
Dataflow Directional Tag Classes.
Compilation - A set of tasks to perform for a single driver invocation.