diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index f58a719a45a84..858065c498846 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -653,6 +653,13 @@ class LangOptions : public LangOptionsBase { void set##Name(Type Value) { Name = static_cast(Value); } #include "clang/Basic/LangOptions.def" + unsigned getTrivialAutoVarInitMaxSize() const { + return TrivialAutoVarInitMaxSize; + } + void setTrivialAutoVarInitMaxSize(unsigned max_size) { + TrivialAutoVarInitMaxSize = max_size; + } + /// Are we compiling a module? bool isCompilingModule() const { return getCompilingModule() != CMK_None; diff --git a/clang/lib/Basic/Targets/BPF.cpp b/clang/lib/Basic/Targets/BPF.cpp index a463de0884020..52efce268642e 100644 --- a/clang/lib/Basic/Targets/BPF.cpp +++ b/clang/lib/Basic/Targets/BPF.cpp @@ -89,6 +89,18 @@ void BPFTargetInfo::fillValidCPUList(SmallVectorImpl &Values) const { Values.append(std::begin(ValidCPUNames), std::end(ValidCPUNames)); } +void BPFTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { + TargetInfo::adjust(Diags, Opts); + + if (Opts.getTrivialAutoVarInit() == + LangOptions::TrivialAutoVarInitKind::Uninitialized) { + Opts.setTrivialAutoVarInit(LangOptions::TrivialAutoVarInitKind::Zero); + // Set the maximum auto init size to be 8 to avoid potential regression + // e.g. for xdp programs where ip/tcp header size is more than 8. + Opts.setTrivialAutoVarInitMaxSize(8); + } +} + llvm::SmallVector BPFTargetInfo::getTargetBuiltins() const { return {{&BuiltinStrings, BuiltinInfos}}; diff --git a/clang/lib/Basic/Targets/BPF.h b/clang/lib/Basic/Targets/BPF.h index d1f68b842348e..80f2593823abe 100644 --- a/clang/lib/Basic/Targets/BPF.h +++ b/clang/lib/Basic/Targets/BPF.h @@ -60,6 +60,8 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo { llvm::SmallVector getTargetBuiltins() const override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; + std::string_view getClobbers() const override { return ""; } BuiltinVaListKind getBuiltinVaListKind() const override { diff --git a/clang/test/CodeGen/bpf-auto-var-init.c b/clang/test/CodeGen/bpf-auto-var-init.c new file mode 100644 index 0000000000000..ea9db64c5d974 --- /dev/null +++ b/clang/test/CodeGen/bpf-auto-var-init.c @@ -0,0 +1,24 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang_cc1 -triple bpf -O2 -emit-llvm %s -o - | FileCheck %s + +int foo1() { + int val; + return val; +} +// CHECK: ret i32 0 + +struct val_t { + int val; +}; + +int foo3() { + struct val_t v; + return v.val; +} +// CHECK: ret i32 0 + +int foo4() { + int val = 5; + return val; +} +// CHECK: ret i32 5