aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-02-25 07:15:16 +0000
committerBill Wendling <isanbard@gmail.com>2013-02-25 07:15:16 +0000
commitd620e09c13b1ca32434ce440abf5bb0f3d0979c5 (patch)
tree7741519fb7d204ac5f8303922943f752d4903cab /lib/CodeGen
parent0a8dead5303bd0cabebf07ab4e8d4f838787e8f1 (diff)
Add more attributes from the command line to functions.
This is an ongoing process. Any command line option which a back-end cares about should be added here. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176009 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/CGCall.cpp60
1 files changed, 59 insertions, 1 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 33b0475c56..1802fe747a 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -23,6 +23,7 @@
#include "clang/AST/DeclObjC.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Frontend/CodeGenOptions.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/InlineAsm.h"
@@ -1023,9 +1024,66 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin);
} else {
// Attributes that should go on the function, but not the call site.
+ if (!CodeGenOpts.CodeModel.empty())
+ FuncAttrs.addAttribute("code-model", CodeGenOpts.CodeModel);
+ if (!CodeGenOpts.RelocationModel.empty())
+ FuncAttrs.addAttribute("relocation-model", CodeGenOpts.RelocationModel);
+
+ if (CodeGenOpts.FloatABI == "soft" || CodeGenOpts.FloatABI == "softfp")
+ FuncAttrs.addAttribute("float-abi", "soft");
+ else if (CodeGenOpts.FloatABI == "hard")
+ FuncAttrs.addAttribute("float-abi", "hard");
+
+ if (!CodeGenOpts.DisableFPElim) {
+ /* ignore */ ;
+ } else if (CodeGenOpts.OmitLeafFramePointer) {
+ FuncAttrs.addAttribute("no-frame-pointer-elim-non-leaf");
+ } else {
+ FuncAttrs.addAttribute("no-frame-pointer-elim");
+ FuncAttrs.addAttribute("no-frame-pointer-elim-non-leaf");
+ }
+
+ switch (CodeGenOpts.getFPContractMode()) {
+ case CodeGenOptions::FPC_Off:
+ FuncAttrs.addAttribute("fp-contract-model", "strict");
+ break;
+ case CodeGenOptions::FPC_On:
+ FuncAttrs.addAttribute("fp-contract-model", "standard");
+ break;
+ case CodeGenOptions::FPC_Fast:
+ FuncAttrs.addAttribute("fp-contract-model", "fast");
+ break;
+ }
+
+ if (CodeGenOpts.LessPreciseFPMAD)
+ FuncAttrs.addAttribute("less-precise-fpmad");
+ if (CodeGenOpts.NoInfsFPMath)
+ FuncAttrs.addAttribute("no-infs-fp-math");
+ if (CodeGenOpts.NoNaNsFPMath)
+ FuncAttrs.addAttribute("no-nans-fp-math");
+ if (CodeGenOpts.NoZeroInitializedInBSS)
+ FuncAttrs.addAttribute("no-zero-init-in-bss");
+ if (CodeGenOpts.UnsafeFPMath)
+ FuncAttrs.addAttribute("unsafe-fp-math");
+ if (CodeGenOpts.SoftFloat)
+ FuncAttrs.addAttribute("use-soft-float");
+ if (CodeGenOpts.StackAlignment)
+ FuncAttrs.addAttribute("stack-align-override",
+ llvm::utostr(CodeGenOpts.StackAlignment));
+ if (CodeGenOpts.StackRealignment)
+ FuncAttrs.addAttribute("realign-stack");
+ if (CodeGenOpts.DisableTailCalls)
+ FuncAttrs.addAttribute("disable-tail-calls");
+ if (!CodeGenOpts.TrapFuncName.empty())
+ FuncAttrs.addAttribute("trap-func-name", CodeGenOpts.TrapFuncName);
+ if (LangOpts.PIELevel != 0)
+ FuncAttrs.addAttribute("pie");
+ if (CodeGenOpts.SSPBufferSize)
+ FuncAttrs.addAttribute("ssp-buffers-size",
+ llvm::utostr(CodeGenOpts.SSPBufferSize));
+
if (!TargetOpts.CPU.empty())
FuncAttrs.addAttribute("target-cpu", TargetOpts.CPU);
-
if (TargetOpts.Features.size()) {
llvm::SubtargetFeatures Features;
for (std::vector<std::string>::const_iterator