本文整理汇总了C++中Compiler类的典型用法代码示例。如果您正苦于以下问题:C++ Compiler类的具体用法?C++ Compiler怎么用?C++ Compiler使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Compiler类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: WXUNUSED
void AdvancedCompilerOptionsDlg::OnRegexTest(wxCommandEvent& WXUNUSED(event))
{
if (m_SelectedRegex == -1)
return;
wxString text = XRCCTRL(*this, "txtRegexTest", wxTextCtrl)->GetValue();
if (text.IsEmpty())
{
cbMessageBox(_("Please enter a compiler line in the \"Compiler output\" text box..."), _("Error"), wxICON_ERROR, this);
return;
}
Compiler* compiler = CompilerFactory::GetCompiler(m_CompilerId);
if (!compiler)
return;
// backup regexes
RegExArray regex_copy = m_Regexes;
SaveRegexDetails(m_SelectedRegex);
// test-run
compiler->SetRegExArray(m_Regexes);
CompilerLineType clt = compiler->CheckForWarningsAndErrors(text);
// restore regexes
compiler->SetRegExArray(regex_copy);
m_Regexes = regex_copy;
wxString msg;
msg.Printf(_("Regular expression analyzed as follows:\n\n"
"Type: %s message\n"
"Filename: %s\n"
"Line number: %s\n"
"Message: %s"),
clt == cltNormal ? _("Normal")
: (clt == cltInfo ? _("Info")
: (clt == cltError ? _("Error") : _("Warning") ) ),
compiler->GetLastErrorFilename().wx_str(),
compiler->GetLastErrorLine().wx_str(),
compiler->GetLastError().wx_str()
);
cbMessageBox(msg, _("Test results"), wxICON_INFORMATION, this);
}
示例2: pow_mpz_mpz
Compiler::value NumberSTD::pow_mpz_mpz(Compiler& c, std::vector<Compiler::value> args) {
auto r = [&]() {
if (args[0].t.temporary) return args[0];
if (args[1].t.temporary) return args[1];
return c.new_mpz();
}();
auto r_addr = c.insn_address_of(r);
auto a = c.insn_address_of(args[0]);
auto b = c.insn_address_of(args[1]);
auto p = c.insn_call(Type::LONG, {b}, &mpz_get_ui);
c.insn_call(Type::VOID, {r_addr, a, p}, &mpz_pow_ui);
if (args[1].t.temporary && args[1] != r) {
c.insn_delete_mpz(args[1]);
}
return r;
}
示例3: jit_insn_branch_if_not
Compiler::value NumberSTD::sub_mpz_int(Compiler& c, std::vector<Compiler::value> args) {
auto a = c.insn_address_of(args[0]);
auto b = args[1];
auto r = c.new_mpz();
auto r_addr = c.insn_address_of(r);
jit_label_t label_end = jit_label_undefined;
jit_label_t label_else = jit_label_undefined;
auto cond = c.insn_lt(b, c.new_integer(0));
jit_insn_branch_if_not(c.F, cond.v, &label_else);
Compiler::value neg_b = {jit_insn_neg(c.F, b.v), Type::INTEGER};
c.insn_call(Type::VOID, {r_addr, a, neg_b}, &mpz_add_ui);
jit_insn_branch(c.F, &label_end);
jit_insn_label(c.F, &label_else);
c.insn_call(Type::VOID, {r_addr, a, b}, &mpz_sub_ui);
jit_insn_label(c.F, &label_end);
if (args[0].t.temporary) {
c.insn_delete_mpz(args[0]);
}
return r;
}
示例4: _T
AutoDetectResult CompilerICC::AutoDetectInstallationDir()
{
wxString sep = wxFileName::GetPathSeparator();
wxString extraDir = _T("");
if (platform::windows)
{
if (wxDirExists(_T("C:\\Program Files\\Intel\\Compiler")))
{
wxDir icc_dir(_T("C:\\Program Files\\Intel\\Compiler\\C++"));
if (icc_dir.IsOpened())
{
wxArrayString dirs;
wxIccDirTraverser IccDirTraverser(dirs);
icc_dir.Traverse(IccDirTraverser);
if (!dirs.IsEmpty())
{
// Now sort the array in reverse order to get the latest version's path
dirs.Sort(true);
m_MasterPath = dirs[0];
m_MasterPath.Append(_T("\\IA32"));
// Now check for the installation of MSVC
const wxString msvcIds[4] = { _T("msvc6"),
_T("msvctk"),
_T("msvc8"),
_T("msvc10") };
bool msvcFound = false;
for (unsigned int which_msvc = 0; which_msvc < array_size(msvcIds); ++which_msvc)
{
Compiler* vcComp = CompilerFactory::GetCompiler(msvcIds[which_msvc]);
if (vcComp)
{
if (vcComp->AutoDetectInstallationDir() == adrDetected)
{
const wxString& vcMasterPath = vcComp->GetMasterPath();
if (m_ExtraPaths.Index(vcMasterPath) == wxNOT_FOUND &&
wxDirExists(vcMasterPath))
{
m_ExtraPaths.Add(vcMasterPath);
}
AddIncludeDir(vcMasterPath + _T("\\Include"));
AddLibDir(vcMasterPath + _T("\\Lib"));
AddResourceIncludeDir(vcMasterPath + _T("\\Include"));
const wxArrayString& vcExtraPaths = vcComp->GetExtraPaths();
for (size_t i = 0; i < vcExtraPaths.GetCount(); ++i)
{
if (m_ExtraPaths.Index(vcExtraPaths[i]) == wxNOT_FOUND &&
wxDirExists(vcExtraPaths[i]))
{
m_ExtraPaths.Add(vcExtraPaths[i]);
}
}
const wxArrayString& vcIncludeDirs = vcComp->GetIncludeDirs();
for (size_t i = 0; i < vcIncludeDirs.GetCount(); ++i)
{
if (wxDirExists(vcIncludeDirs[i]))
{
if (m_IncludeDirs.Index(vcIncludeDirs[i]) == wxNOT_FOUND)
{
AddIncludeDir(vcIncludeDirs[i]);
}
if (m_ResIncludeDirs.Index(vcIncludeDirs[i]) == wxNOT_FOUND)
{
AddResourceIncludeDir(vcIncludeDirs[i]);
}
}
}
const wxArrayString& vcLibDirs = vcComp->GetLibDirs();
for (size_t i = 0; i < vcLibDirs.GetCount(); ++i)
{
if (m_LibDirs.Index(vcLibDirs[i]) == wxNOT_FOUND &&
wxDirExists(vcLibDirs[i]))
{
AddLibDir(vcLibDirs[i]);
}
}
msvcFound = true;
break;
}
}
}
if (!msvcFound)
{
cbMessageBox(_T("It seems your computer doesn't have a working MSVC compiler.\n\n"
"This compiler requires MS compiler for proper functioning and\n"
"it may not work without it."),
_T("Error"), wxOK | wxICON_ERROR);
}
}
}
}
// Read the ICPP_COMPILER90 environment variable
wxGetEnv(_T("ICPP_COMPILER90"), &m_MasterPath);
extraDir = sep + _T("IA32");// Intel also provides compiler for Itanium processors
//.........这里部分代码省略.........
示例5: compile
Compiler::value If::compile(Compiler& c) const {
auto label_then = c.insn_init_label("then");
auto label_else = c.insn_init_label("else");
auto label_end = c.insn_init_label("end");
Compiler::value then_v;
Compiler::value else_v;
auto cond = condition->compile(c);
condition->compile_end(c);
auto cond_boolean = c.insn_to_bool(cond);
c.insn_delete_temporary(cond);
c.insn_if_new(cond_boolean, &label_then, &label_else);
c.insn_label(&label_then);
then_v = c.insn_convert(then->compile(c), type.fold());
if (!then_v.v) then_v = c.insn_convert(c.new_null(), type.fold());
then->compile_end(c);
c.insn_branch(&label_end);
label_then.block = Compiler::builder.GetInsertBlock();
c.insn_label(&label_else);
if (elze != nullptr) {
else_v = c.insn_convert(elze->compile(c), type.fold());
elze->compile_end(c);
} else {
else_v = c.insn_convert(c.new_null(), type.fold());
}
c.insn_branch(&label_end);
label_else.block = Compiler::builder.GetInsertBlock();
c.insn_label(&label_end);
if (type.is_void()) {
return {};
} else {
return c.insn_phi(type, then_v, label_then, else_v, label_else);
}
}
示例6: icc_dir
AutoDetectResult CompilerICC::AutoDetectInstallationDir()
{
wxString sep = wxFileName::GetPathSeparator();
if (platform::windows)
{
if ( wxDirExists(_T("C:\\Program Files\\Intel\\Compiler")) )
{
wxDir icc_dir(_T("C:\\Program Files\\Intel\\Compiler\\C++"));
if (icc_dir.IsOpened())
{
wxArrayString dirs;
wxIccDirTraverser IccDirTraverser(dirs);
icc_dir.Traverse(IccDirTraverser);
if (!dirs.IsEmpty())
{
// Now sort the array in reverse order to get the latest version's path
dirs.Sort(true);
m_MasterPath = dirs[0];
m_MasterPath.Append(_T("\\IA32"));
}
}
}
int version = 0;
while ( m_MasterPath.IsEmpty() || !wxDirExists(m_MasterPath) )
{
wxString iccEnvVar;
if (version==0)
{
// Try default w/o version number
iccEnvVar = _T("ICPP_COMPILER");
version = 8;
}
else if (version>15)
break; // exit while-loop
else
{
// Try ICPP_COMPILER80 ... ICPP_COMPILER12
iccEnvVar.Printf(wxT("ICPP_COMPILER%d0"), version);
version++;
}
// Read the ICPP_COMPILER[XX] environment variable
if ( !wxGetEnv(iccEnvVar, &m_MasterPath) )
m_MasterPath.Clear();
}
// Now check for the installation of MSVC
const wxString msvcIds[4] = { _T("msvc6"),
_T("msvctk"),
_T("msvc8"),
_T("msvc10") };
bool msvcFound = false;
for (unsigned int which_msvc = 0; which_msvc < array_size(msvcIds); ++which_msvc)
{
Compiler* vcComp = CompilerFactory::GetCompiler(msvcIds[which_msvc]);
if (!vcComp)
continue; // compiler not registered? try next one
wxString vcMasterNoMacros = vcComp->GetMasterPath();
Manager::Get()->GetMacrosManager()->ReplaceMacros(vcMasterNoMacros);
if ( !wxFileExists(vcMasterNoMacros + sep + wxT("bin") + sep + vcComp->GetPrograms().C)
&& !wxFileExists(vcMasterNoMacros + sep + vcComp->GetPrograms().C) )
continue; // this MSVC is not installed; try next one
const wxString& vcMasterPath = vcComp->GetMasterPath();
if (m_ExtraPaths.Index(vcMasterPath) == wxNOT_FOUND)
m_ExtraPaths.Add(vcMasterPath);
if ( !vcMasterPath.EndsWith(wxT("bin"))
&& m_ExtraPaths.Index(vcMasterPath + sep + wxT("bin")) == wxNOT_FOUND )
{
m_ExtraPaths.Add(vcMasterPath + sep + wxT("bin"));
}
AddIncludeDir(vcMasterPath + _T("\\Include"));
AddLibDir(vcMasterPath + _T("\\Lib"));
AddResourceIncludeDir(vcMasterPath + _T("\\Include"));
const wxArrayString& vcExtraPaths = vcComp->GetExtraPaths();
for (size_t i = 0; i < vcExtraPaths.GetCount(); ++i)
{
if ( m_ExtraPaths.Index(vcExtraPaths[i]) == wxNOT_FOUND
&& wxDirExists(vcExtraPaths[i]) )
{
m_ExtraPaths.Add(vcExtraPaths[i]);
}
}
const wxArrayString& vcIncludeDirs = vcComp->GetIncludeDirs();
for (size_t i = 0; i < vcIncludeDirs.GetCount(); ++i)
{
if (wxDirExists(vcIncludeDirs[i]))
{
if (m_IncludeDirs.Index(vcIncludeDirs[i]) == wxNOT_FOUND)
AddIncludeDir(vcIncludeDirs[i]);
if (m_ResIncludeDirs.Index(vcIncludeDirs[i]) == wxNOT_FOUND)
AddResourceIncludeDir(vcIncludeDirs[i]);
}
}
const wxArrayString& vcLibDirs = vcComp->GetLibDirs();
//.........这里部分代码省略.........
示例7: IFTRACE
llvm_value CompileExpression::DoRewrite(RewriteCandidate &cand)
// ----------------------------------------------------------------------------
// Generate code for a particular rewwrite candidate
// ----------------------------------------------------------------------------
{
Infix *rw = cand.rewrite;
llvm_value result = NULL;
IFTRACE(calltypes)
std::cerr << "Rewrite: " << rw << "\n";
// Evaluate parameters
llvm_values args;
RewriteBindings &bnds = cand.bindings;
RewriteBindings::iterator b;
for (b = bnds.begin(); b != bnds.end(); b++)
{
Tree *tree = (*b).value;
IFTRACE(calltypes)
std::cerr << " Arg: " << tree << ": ";
if (llvm_value closure = (*b).Closure(unit))
{
args.push_back(closure);
IFTRACE(calltypes)
llvm::errs() << " closure " << *closure << "\n";
}
else if (llvm_value value = Value(tree))
{
args.push_back(value);
llvm_type mtype = value->getType();
if (unit->compiler->IsClosureType(mtype))
(*b).closure = value;
IFTRACE(calltypes)
llvm::errs() << " value " << *value
<< " mtype " << *mtype << "\n";
}
}
// Check if this is an LLVM builtin
Tree *builtin = NULL;
if (Tree *value = rw->right)
if (Prefix *prefix = value->AsPrefix())
if (Name *name = prefix->left->AsName())
if (name->value == "opcode")
builtin = prefix->right;
if (builtin)
{
llvm_builder bld = unit->code;
if (Prefix *prefix = builtin->AsPrefix())
{
if (Name *name = prefix->left->AsName())
{
if (name->value == "data")
{
bld = unit->data;
builtin = prefix->right;
}
}
}
Name *name = builtin->AsName();
if (!name)
{
Ooops("Malformed primitive $1", builtin);
result = unit->CallFormError(builtin);
}
else
{
Compiler *compiler = unit->compiler;
text op = name->value;
uint sz = args.size();
llvm_value *a = &args[0];
result = compiler->Primitive(*unit, bld, op, sz, a);
if (!result)
Ooops("Invalid primitive $1", builtin);
IFTRACE(calltypes)
llvm::errs() << " = Primitive: " << *result << "\n";
}
}
else
{
llvm_value function = unit->Compile(cand, args);
IFTRACE(calltypes)
llvm::errs() << " < Function: " << *function << "\n";
if (function)
result = unit->code->CreateCall(function, LLVMS_ARGS(args));
IFTRACE(calltypes)
llvm::errs() << " =Call: " << *result << "\n";
}
return result;
}
示例8: main
int main()
{
using namespace moon;
Compiler compiler; // Script parsing and bytecode output.
VM vm; // Executes bytecode produced by a Compiler.
try
{
compiler.parseScript(&vm, "tests/script/globals.ml");
compiler.compile(&vm);
// Init the globals:
logStream() << "C++: First run...\n";
vm.execute();
// Print the current values:
logStream() << "C++: Calling print_globals()...\n";
vm.call("print_globals");
// Change them:
logStream() << "C++: Editing globals vars...\n";
{
Variant var;
var.type = Variant::Type::Integer;
var.value.asInteger = 1337;
MOON_ASSERT(vm.globals.setGlobal("an_integer", var) == true);
var.type = Variant::Type::Float;
var.value.asFloat = 3.141592;
MOON_ASSERT(vm.globals.setGlobal("a_float", var) == true);
var.type = Variant::Type::Range;
var.value.asRange.begin = -5;
var.value.asRange.end = +5;
MOON_ASSERT(vm.globals.setGlobal("a_range", var) == true);
var.type = Variant::Type::Str;
const char * s = "hello from C++";
var.value.asString = Str::newFromString(vm, s, std::strlen(s), true);
MOON_ASSERT(vm.globals.setGlobal("a_string", var) == true);
}
// Print the new values:
logStream() << "C++: Calling print_globals() again...\n";
vm.call("print_globals");
}
catch (...)
{
#if MOON_SAVE_SCRIPT_CALLSTACK
if (!vm.callstack.isEmpty())
{
vm.printStackTrace(logStream());
}
#endif // MOON_SAVE_SCRIPT_CALLSTACK
logStream() << color::red() << "terminating with error(s)...\n" << color::restore();
return EXIT_FAILURE;
}
}
示例9: slang_reflect
static bool slang_reflect(const Compiler &vertex_compiler, const Compiler &fragment_compiler,
const ShaderResources &vertex, const ShaderResources &fragment,
slang_reflection *reflection)
{
// Validate use of unexpected types.
if (
!vertex.sampled_images.empty() ||
!vertex.storage_buffers.empty() ||
!vertex.subpass_inputs.empty() ||
!vertex.storage_images.empty() ||
!vertex.atomic_counters.empty() ||
!fragment.storage_buffers.empty() ||
!fragment.subpass_inputs.empty() ||
!fragment.storage_images.empty() ||
!fragment.atomic_counters.empty())
{
RARCH_ERR("[slang]: Invalid resource type detected.\n");
return false;
}
// Validate vertex input.
if (vertex.stage_inputs.size() != 2)
{
RARCH_ERR("[slang]: Vertex must have two attributes.\n");
return false;
}
if (fragment.stage_outputs.size() != 1)
{
RARCH_ERR("[slang]: Multiple render targets not supported.\n");
return false;
}
if (fragment_compiler.get_decoration(fragment.stage_outputs[0].id, spv::DecorationLocation) != 0)
{
RARCH_ERR("[slang]: Render target must use location = 0.\n");
return false;
}
uint32_t location_mask = 0;
for (auto &input : vertex.stage_inputs)
location_mask |= 1 << vertex_compiler.get_decoration(input.id, spv::DecorationLocation);
if (location_mask != 0x3)
{
RARCH_ERR("[slang]: The two vertex attributes do not use location = 0 and location = 1.\n");
return false;
}
// Validate the single uniform buffer.
if (vertex.uniform_buffers.size() > 1)
{
RARCH_ERR("[slang]: Vertex must use zero or one uniform buffer.\n");
return false;
}
if (fragment.uniform_buffers.size() > 1)
{
RARCH_ERR("[slang]: Fragment must use zero or one uniform buffer.\n");
return false;
}
// Validate the single push constant buffer.
if (vertex.push_constant_buffers.size() > 1)
{
RARCH_ERR("[slang]: Vertex must use zero or one push constant buffers.\n");
return false;
}
if (fragment.push_constant_buffers.size() > 1)
{
RARCH_ERR("[slang]: Fragment must use zero or one push cosntant buffer.\n");
return false;
}
uint32_t vertex_ubo = vertex.uniform_buffers.empty() ? 0 : vertex.uniform_buffers[0].id;
uint32_t fragment_ubo = fragment.uniform_buffers.empty() ? 0 : fragment.uniform_buffers[0].id;
uint32_t vertex_push = vertex.push_constant_buffers.empty() ? 0 : vertex.push_constant_buffers[0].id;
uint32_t fragment_push = fragment.push_constant_buffers.empty() ? 0 : fragment.push_constant_buffers[0].id;
if (vertex_ubo &&
vertex_compiler.get_decoration(vertex_ubo, spv::DecorationDescriptorSet) != 0)
{
RARCH_ERR("[slang]: Resources must use descriptor set #0.\n");
return false;
}
if (fragment_ubo &&
fragment_compiler.get_decoration(fragment_ubo, spv::DecorationDescriptorSet) != 0)
{
RARCH_ERR("[slang]: Resources must use descriptor set #0.\n");
return false;
}
unsigned vertex_ubo_binding = vertex_ubo ?
vertex_compiler.get_decoration(vertex_ubo, spv::DecorationBinding) : -1u;
unsigned fragment_ubo_binding = fragment_ubo ?
fragment_compiler.get_decoration(fragment_ubo, spv::DecorationBinding) : -1u;
bool has_ubo = vertex_ubo || fragment_ubo;
//.........这里部分代码省略.........
示例10: add_active_buffer_ranges
static bool add_active_buffer_ranges(const Compiler &compiler, const Resource &resource,
slang_reflection *reflection, bool push_constant)
{
// Get which uniforms are actually in use by this shader.
auto ranges = compiler.get_active_buffer_ranges(resource.id);
for (auto &range : ranges)
{
auto &name = compiler.get_member_name(resource.base_type_id, range.index);
auto &type = compiler.get_type(compiler.get_type(resource.base_type_id).member_types[range.index]);
unsigned sem_index = 0;
unsigned tex_sem_index = 0;
auto sem = slang_uniform_name_to_semantic(*reflection->semantic_map, name, &sem_index);
auto tex_sem = slang_uniform_name_to_texture_semantic(*reflection->texture_semantic_uniform_map,
name, &tex_sem_index);
if (tex_sem == SLANG_TEXTURE_SEMANTIC_PASS_OUTPUT && tex_sem_index >= reflection->pass_number)
{
RARCH_ERR("[slang]: Non causal filter chain detected. Shader is trying to use output from pass #%u, but this shader is pass #%u.\n",
tex_sem_index, reflection->pass_number);
return false;
}
if (sem != SLANG_INVALID_SEMANTIC)
{
if (!validate_type_for_semantic(type, sem))
{
RARCH_ERR("[slang]: Underlying type of semantic is invalid.\n");
return false;
}
switch (sem)
{
case SLANG_SEMANTIC_FLOAT_PARAMETER:
if (!set_ubo_float_parameter_offset(reflection, sem_index, range.offset, type.vecsize, push_constant))
return false;
break;
default:
if (!set_ubo_offset(reflection, sem, range.offset, type.vecsize, push_constant))
return false;
break;
}
}
else if (tex_sem != SLANG_INVALID_TEXTURE_SEMANTIC)
{
if (!validate_type_for_texture_semantic(type))
{
RARCH_ERR("[slang]: Underlying type of texture semantic is invalid.\n");
return false;
}
if (!set_ubo_texture_offset(reflection, tex_sem, tex_sem_index, range.offset, push_constant))
return false;
}
else
{
RARCH_ERR("[slang]: Unknown semantic found.\n");
return false;
}
}
return true;
}
示例11: CompilerGNUPOWERPC
Compiler * CompilerGNUPOWERPC::CreateCopy()
{
Compiler* c = new CompilerGNUPOWERPC(*this);
c->SetExtraPaths(m_ExtraPaths); // wxArrayString doesn't seem to be copied with the default copy ctor...
return c;
}
示例12: emit_lvalue
bool AstIdentifier::emit_lvalue(Compiler &c) const {
c.push_inst(Instruction::make_get(name.c_str(), Instruction::GET_NAME_REF));
return false;
}
示例13: accept
void NodePrintLine::accept(Compiler& c) { c.nodePrintLine(*this); }
示例14: TreeNodeInfoInitCall
//------------------------------------------------------------------------
// TreeNodeInfoInitCall: Set the NodeInfo for a call.
//
// Arguments:
// call - The call node of interest
//
// Return Value:
// None.
//
void Lowering::TreeNodeInfoInitCall(GenTreeCall* call)
{
TreeNodeInfo* info = &(call->gtLsraInfo);
LinearScan* l = m_lsra;
Compiler* compiler = comp;
bool hasMultiRegRetVal = false;
ReturnTypeDesc* retTypeDesc = nullptr;
info->srcCount = 0;
if (call->TypeGet() != TYP_VOID)
{
hasMultiRegRetVal = call->HasMultiRegRetVal();
if (hasMultiRegRetVal)
{
// dst count = number of registers in which the value is returned by call
retTypeDesc = call->GetReturnTypeDesc();
info->dstCount = retTypeDesc->GetReturnRegCount();
}
else
{
info->dstCount = 1;
}
}
else
{
info->dstCount = 0;
}
GenTree* ctrlExpr = call->gtControlExpr;
if (call->gtCallType == CT_INDIRECT)
{
// either gtControlExpr != null or gtCallAddr != null.
// Both cannot be non-null at the same time.
assert(ctrlExpr == nullptr);
assert(call->gtCallAddr != nullptr);
ctrlExpr = call->gtCallAddr;
}
// set reg requirements on call target represented as control sequence.
if (ctrlExpr != nullptr)
{
// we should never see a gtControlExpr whose type is void.
assert(ctrlExpr->TypeGet() != TYP_VOID);
info->srcCount++;
// In case of fast tail implemented as jmp, make sure that gtControlExpr is
// computed into a register.
if (call->IsFastTailCall())
{
NYI_ARM("tail call");
#ifdef _TARGET_ARM64_
// Fast tail call - make sure that call target is always computed in IP0
// so that epilog sequence can generate "br xip0" to achieve fast tail call.
ctrlExpr->gtLsraInfo.setSrcCandidates(l, genRegMask(REG_IP0));
#endif // _TARGET_ARM64_
}
}
#ifdef _TARGET_ARM_
else
{
info->internalIntCount = 1;
}
#endif // _TARGET_ARM_
RegisterType registerType = call->TypeGet();
// Set destination candidates for return value of the call.
#ifdef _TARGET_ARM_
if (call->IsHelperCall(compiler, CORINFO_HELP_INIT_PINVOKE_FRAME))
{
// The ARM CORINFO_HELP_INIT_PINVOKE_FRAME helper uses a custom calling convention that returns with
// TCB in REG_PINVOKE_TCB. fgMorphCall() sets the correct argument registers.
info->setDstCandidates(l, RBM_PINVOKE_TCB);
}
else
#endif // _TARGET_ARM_
if (hasMultiRegRetVal)
{
assert(retTypeDesc != nullptr);
info->setDstCandidates(l, retTypeDesc->GetABIReturnRegs());
}
else if (varTypeIsFloating(registerType))
{
info->setDstCandidates(l, RBM_FLOATRET);
}
else if (registerType == TYP_LONG)
{
info->setDstCandidates(l, RBM_LNGRET);
//.........这里部分代码省略.........
示例15: wxT
// Don't call this function from within the scope of:
// ClangPlugin::OnEditorHook
// ClangPlugin::OnTimer
int ClangPlugin::UpdateCompileCommand(cbEditor* ed)
{
wxString compileCommand;
ProjectFile* pf = ed->GetProjectFile();
m_UpdateCompileCommand++;
if ( m_UpdateCompileCommand > 1 )
{
// Re-entry is not allowed
m_UpdateCompileCommand--;
return 0;
}
ProjectBuildTarget* target = nullptr;
Compiler* comp = nullptr;
if (pf && pf->GetParentProject() && !pf->GetBuildTargets().IsEmpty())
{
target = pf->GetParentProject()->GetBuildTarget(pf->GetBuildTargets()[0]);
comp = CompilerFactory::GetCompiler(target->GetCompilerID());
}
cbProject* proj = (pf ? pf->GetParentProject() : nullptr);
if ( (!comp) && proj)
comp = CompilerFactory::GetCompiler(proj->GetCompilerID());
if (!comp)
{
cbProject* tmpPrj = Manager::Get()->GetProjectManager()->GetActiveProject();
if (tmpPrj)
comp = CompilerFactory::GetCompiler(tmpPrj->GetCompilerID());
}
if (!comp)
comp = CompilerFactory::GetDefaultCompiler();
if (pf && (!pf->GetBuildTargets().IsEmpty()) )
{
target = pf->GetParentProject()->GetBuildTarget(pf->GetBuildTargets()[0]);
if (pf->GetUseCustomBuildCommand(target->GetCompilerID() ))
compileCommand = pf->GetCustomBuildCommand(target->GetCompilerID()).AfterFirst(wxT(' '));
}
if (compileCommand.IsEmpty())
compileCommand = wxT("$options $includes");
CompilerCommandGenerator* gen = comp->GetCommandGenerator(proj);
if (gen)
gen->GenerateCommandLine(compileCommand, target, pf, ed->GetFilename(),
g_InvalidStr, g_InvalidStr, g_InvalidStr );
delete gen;
wxStringTokenizer tokenizer(compileCommand);
compileCommand.Empty();
wxString pathStr;
while (tokenizer.HasMoreTokens())
{
wxString flag = tokenizer.GetNextToken();
// make all include paths absolute, so clang does not choke if Code::Blocks switches directories
if (flag.StartsWith(wxT("-I"), &pathStr))
{
wxFileName path(pathStr);
if (path.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE))
flag = wxT("-I") + path.GetFullPath();
}
compileCommand += flag + wxT(" ");
}
compileCommand += GetCompilerInclDirs(comp->GetID());
m_UpdateCompileCommand--;
if (compileCommand != m_CompileCommand)
{
m_CompileCommand = compileCommand;
return 1;
}
return 0;
}