Skip to content

Commit 05e9b52

Browse files
committed
[Xtensa] Implement esp32 psram cache fixes.
1 parent d06aac6 commit 05e9b52

File tree

10 files changed

+525
-0
lines changed

10 files changed

+525
-0
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ def m_x86_Features_Group : OptionGroup<"<x86 features group>">,
176176
Group<m_Group>, Flags<[CoreOption]>, DocName<"X86">;
177177
def m_riscv_Features_Group : OptionGroup<"<riscv features group>">,
178178
Group<m_Group>, DocName<"RISCV">;
179+
def m_xtensa_Features_Group : OptionGroup<"<xtensa features group>">,
180+
Group<m_Group>, Flags<[CoreOption]>, DocName<"Xtensa">;
179181

180182
def m_libc_Group : OptionGroup<"<m libc group>">, Group<m_mips_Features_Group>,
181183
Flags<[HelpHidden]>;
@@ -4255,6 +4257,13 @@ def mno_retpoline_external_thunk : Flag<["-"], "mno-retpoline-external-thunk">,
42554257
def mvzeroupper : Flag<["-"], "mvzeroupper">, Group<m_x86_Features_Group>;
42564258
def mno_vzeroupper : Flag<["-"], "mno-vzeroupper">, Group<m_x86_Features_Group>;
42574259

4260+
// Xtensa feature flags
4261+
def malways_memw : Flag<["-"], "malways-memw">, Group<m_xtensa_Features_Group>;
4262+
def mfix_esp32_psram_cache_issue : Flag<["-"], "mfix-esp32-psram-cache-issue">, Group<m_xtensa_Features_Group>;
4263+
def mfix_esp32_psram_cache_strategy_EQ : Joined<["-"], "mfix-esp32-psram-cache-strategy=">, Group<m_xtensa_Features_Group>,
4264+
HelpText<" Psram cache fix strategies : memw, nops">,
4265+
Values<"memw, nops">;
4266+
42584267
// These are legacy user-facing driver-level option spellings. They are always
42594268
// aliases for options that are spelled using the more common Unix / GNU flag
42604269
// style of double-dash and equals-joined flags.

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,6 +1728,10 @@ void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
17281728
case llvm::Triple::ve:
17291729
AddVETargetArgs(Args, CmdArgs);
17301730
break;
1731+
1732+
case llvm::Triple::xtensa:
1733+
AddXtensaTargetArgs(Args, CmdArgs);
1734+
break;
17311735
}
17321736
}
17331737

@@ -2276,6 +2280,34 @@ void Clang::AddVETargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
22762280
CmdArgs.push_back("hard");
22772281
}
22782282

2283+
void Clang::AddXtensaTargetArgs(const ArgList &Args,
2284+
ArgStringList &CmdArgs) const {
2285+
const Driver &D = getToolChain().getDriver();
2286+
2287+
if (Args.getLastArg(options::OPT_malways_memw) != nullptr) {
2288+
CmdArgs.push_back("-mllvm");
2289+
CmdArgs.push_back("-malways-memw");
2290+
}
2291+
2292+
if (Args.getLastArg(options::OPT_mfix_esp32_psram_cache_issue) != nullptr) {
2293+
CmdArgs.push_back("-mllvm");
2294+
CmdArgs.push_back("-mfix-esp32-psram-cache-issue");
2295+
2296+
if (Arg *A =
2297+
Args.getLastArg(options::OPT_mfix_esp32_psram_cache_strategy_EQ)) {
2298+
StringRef Value = A->getValue();
2299+
if (Value == "memw" || Value == "nops") {
2300+
CmdArgs.push_back("-mllvm");
2301+
CmdArgs.push_back(
2302+
Args.MakeArgString("-mfix-esp32-psram-cache-strategy=" + Value));
2303+
} else {
2304+
D.Diag(diag::err_drv_unsupported_option_argument)
2305+
<< A->getOption().getName() << Value;
2306+
}
2307+
}
2308+
}
2309+
}
2310+
22792311
void Clang::DumpCompilationDatabase(Compilation &C, StringRef Filename,
22802312
StringRef Target, const InputInfo &Output,
22812313
const InputInfo &Input, const ArgList &Args) const {

clang/lib/Driver/ToolChains/Clang.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
7575
llvm::opt::ArgStringList &CmdArgs) const;
7676
void AddVETargetArgs(const llvm::opt::ArgList &Args,
7777
llvm::opt::ArgStringList &CmdArgs) const;
78+
void AddXtensaTargetArgs(const llvm::opt::ArgList &Args,
79+
llvm::opt::ArgStringList &CmdArgs) const;
7880

7981
enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
8082

clang/lib/Driver/ToolChains/Xtensa.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,32 @@ XtensaToolChain::XtensaToolChain(const Driver &D, const llvm::Triple &Triple,
107107
IsIntegratedAsm = false;
108108
}
109109

110+
bool IsESP32 = XtensaToolChain::GetTargetCPUVersion(Args).equals("esp32");
110111
Multilibs.push_back(Multilib());
112+
if (IsESP32)
113+
Multilibs.push_back(Multilib("esp32-psram", {}, {}, 2)
114+
.flag("+mfix-esp32-psram-cache-issue"));
111115

112116
Multilibs.push_back(
113117
Multilib("no-rtti", {}, {}, 1).flag("+fno-rtti").flag("-frtti"));
114118

119+
if (IsESP32)
120+
Multilibs.push_back(Multilib("esp32-psram/no-rtti", {}, {}, 3)
121+
.flag("+fno-rtti")
122+
.flag("-frtti")
123+
.flag("+mfix-esp32-psram-cache-issue"));
124+
115125
Multilib::flags_list Flags;
116126
addMultilibFlag(
117127
Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti, false), "frtti",
118128
Flags);
119129

130+
if (IsESP32)
131+
addMultilibFlag(Args.hasFlag(options::OPT_mfix_esp32_psram_cache_issue,
132+
options::OPT_mfix_esp32_psram_cache_issue,
133+
false),
134+
"mfix-esp32-psram-cache-issue", Flags);
135+
120136
Multilibs.select(Flags, SelectedMultilib);
121137

122138
const std::string Slash = XtensaGCCToolchain.Slash;

llvm/lib/Target/Xtensa/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_public_tablegen_target(XtensaCommonTableGen)
1717
add_llvm_target(XtensaCodeGen
1818
XtensaAsmPrinter.cpp
1919
XtensaConstantPoolValue.cpp
20+
XtensaESP32PSRAMFix.cpp
2021
XtensaFixupHWLoops.cpp
2122
XtensaFrameLowering.cpp
2223
XtensaHardwareLoops.cpp

llvm/lib/Target/Xtensa/Xtensa.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ FunctionPass *createXtensaISelDag(XtensaTargetMachine &TM,
2828
FunctionPass *createXtensaSizeReductionPass();
2929
FunctionPass *createXtensaHardwareLoops();
3030
FunctionPass *createXtensaFixupHwLoops();
31+
FunctionPass *createXtensaPSRAMCacheFixPass();
3132
} // namespace llvm
3233
#endif /* LLVM_LIB_TARGET_XTENSA_XTENSA_H */

0 commit comments

Comments
 (0)